Funzione Perl semctl
Descrizione
Questa funzione controlla un semaforo di System V. Sarà necessario importare il modulo IPC: SysV per ottenere le definizioni corrette per CMD. La funzione chiama la funzione semctl () di sistema.
Sintassi
Di seguito è riportata la semplice sintassi per questa funzione:
semctl ID, SEMNUM, CMD, ARG
Valore di ritorno
Questa funzione restituisce undef in caso di errore e 0 ma true in caso di successo.
Esempio
Di seguito è riportato il codice di esempio che mostra il suo utilizzo di base, la creazione di un semaforo e l'incremento del suo valore -
#!/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 semaphore
$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 );
Esegui il programma sopra in background usando $ left.pl & e scrivi seguendo un altro programma. Qui Left imposta il semaforo su 2 e Right stampa Right e reimposta il semaforo su 0. Questo continua finché Left termina il suo ciclo dopodiché distrugge il semaforo con 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 viene eseguito il codice sopra, produce il seguente risultato:
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....