Perl semop 函数
描述
此函数对与 KEY 关联的信号量 ID 执行由 OPSTRING 定义的信号量操作。 OPSTRING 应该是 semop 结构的打包数组,每个结构都可以生成。
语法
以下是此函数的简单语法 −
semop KEY, OPSTRING
返回值
此函数在失败时返回 0,在成功时返回 1。
示例
以下是显示其基本用法的示例代码,创建信号量并增加其值 −
#!/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 并将信号量重置为 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....