目录

semop

描述 (Description)

此函数执行由OPSTRING定义的与KEY关联的信号量ID的信号量操作。 OPSTRING应该是semop结构的打包数组,并且每个结构都可以生成。

语法 (Syntax)

以下是此函数的简单语法 -

semop KEY, OPSTRING

返回值 (Return Value)

此函数在失败时返回0,在成功时返回1。

例子 (Example)

以下示例代码显示其基本用法,创建信号量并增加其值 -

#!/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 );

使用$ left.pl&在后台运行上面的程序,然后写下另一个程序。 这里Left将信号量设置为2并且Right将Right设置为Right并将信号量重置为0.这将一直持续到Left完成其循环,然后使用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 $! ";
}

现在运行right.pl,它将产生以下结果 -

Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....
Right....
Left....
↑回到顶部↑
WIKI教程 @2018