Função Perl semget
Descrição
Esta função retorna o ID do semáforo associado a KEY, usando a função de sistema semget () ie. Encontra o semáforo associado a KEY.
Sintaxe
A seguir está a sintaxe simples para esta função -
semget KEY, NSEMS, FLAGS
Valor de retorno
Esta função retorna undef em caso de falha e 0, mas verdadeiro em caso de sucesso.
Exemplo
A seguir está o código de exemplo que mostra seu uso básico, criando um semáforo e incrementando seu valor -
#!/usr/bin/perl -w
# Assume this file name is left.pl
use IPC::SysV;
#use these next two lines if the previous use fails.
eval 'sub IPC_CREAT {0001000}' unless defined &IPC_CREAT;
eval 'sub IPC_EXCL {0002000}' unless defined &IPC_EXCL;
eval 'sub IPC_RMID {0}' unless defined &IPC_RMID;
$key = 1066;
$| = 1;
$num = 0;
$flag = 0;
# Create the semaphor
$id = semget ( $key, 1, &IPC_EXCL|&IPC_CREAT|0777 ) or
die "Can't semget: $!";
foreach( 1..5) {
$op = 0;
$operation = pack( "s*", $num, $op, $flags );
semop( $id, $operation ) or die "Can't semop: $! ";
print "Left....\n";
sleep 1;
$op = 2;
$operation = pack( "s*", $num, $op, $flags );
# add 2 to the semaphore ( now 2 )
semop( $id, $operation ) or die "Can't semop $! ";
}
semctl ( $id, 0, &IPC_RMID, 0 );
Execute o programa acima em segundo plano usando $ left.pl & e escreva seguindo outro programa. Aqui, a esquerda define o semáforo para 2 e a direita imprime a direita e redefine o semáforo para 0. Isso continua até que a esquerda termine seu loop, após o qual destrói o semáforo com semctl ()
#!/usr/bin/perl -w
# Assume this file name is right.pl
$key = 1066;
$| = 1;
$num = 0;
$flags = 0;
# Identify the semaphore created by left.
$id = semget( $key, 1, 0 ) or die ("Can't semgt : $!" );
foreach( 1..5) {
$op = -1;
$operation = pack( "s*", $num, $op, $flags );
# Add -1 to the semaphore (now 1)
semop( $id, $operation ) or die " Can't semop $!";
print "Right....\n";
sleep 1;
$operation = pack( "s*", $num, $op, $flags );
# Add -1 to the semaphore (now 0)
semop( $id, $operation ) or die "Can't semop $! ";
}
Quando o código acima é executado, ele produz o seguinte resultado. Agora execute right.pl e ele produzirá os seguintes resultados -
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....