该函数使用系统函数semget()返回与KEY相关的信号量ID。查找与KEY相关的信号量。
以下是此函数的简单语法-
semget KEY, NSEMS, FLAGS
该函数在失败时返回undef,在成功时返回0,但返回true。
以下是显示其基本用法,创建信号量并增加其值的示例代码-
#!/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 );
Run the above program in background using $left.pl& and write following another program. Here Left sets the semaphore to 2 and Right prints Right and resets the semaphore to 0. This continues until Left finishes its loop after which it destroys the semaphore with 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....
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)