Perl semctl 函数

  • 描述

    semctl 此函数控制System V信号灯。您将需要导入IPC:SysV模块以获取CMD的正确定义。该函数调用系统 semctl()函数。
  • 句法

    以下是此函数的简单语法-
    
    semctl ID, SEMNUM, CMD, ARG
    
  • 返回值

    该函数在失败时返回undef,在成功时返回0,但返回true。
  • 示例

    以下是显示其基本用法的示例代码-
     
    # 这个文件名为 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 );
    
    使用$left.pl &在后台运行上述程序,并在另一个程序之后编写。在这里,“左”将信号量设置为2,“右”输出右信号并将信号量重置为0。这一直持续到“左”完成其循环,然后使用semctl()销毁信号量。
     
    # 这个文件名为 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....
    Left....
    Right....
    Left....
    Right....
    Left....
    Right....
    Left....
    Right....
    Left....