Función Perl semop

Descripción

Esta función realiza las operaciones de semáforo definidas por OPSTRING en el ID de semáforo asociado con KEY. OPSTRING debe ser una matriz empaquetada de estructuras semop, y cada estructura se puede generar con.

Sintaxis

A continuación se muestra la sintaxis simple para esta función:

semop KEY, OPSTRING

Valor devuelto

Esta función devuelve 0 en caso de error y 1 en caso de éxito.

Ejemplo

A continuación se muestra el código de ejemplo que muestra su uso básico, creando un semáforo e incrementando su 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 );

Ejecute el programa anterior en segundo plano usando $ left.pl & y escriba siguiendo otro programa. Aquí Izquierda establece el semáforo en 2 y Derecha imprime Derecha y restablece el semáforo en 0. Esto continúa hasta que Izquierda finaliza su ciclo después de lo cual destruye el semáforo 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 $! ";
}

Ahora ejecute right.pl y producirá los siguientes resultados:

Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....