- Perl 基础知识
- Perl - 主页
- Perl - 简介
- Perl - 环境
- Perl - 语法概述
- Perl - 数据类型
- Perl - 变量
- Perl - 标量
- Perl - 数组
- Perl - 哈希
- Perl - IF...ELSE
- Perl - 循环
- Perl - 运算符
- Perl - 日期和时间
- Perl - 子例程
- Perl - 参考资料
- Perl - 格式
- Perl - 文件 I/O
- Perl - 目录
- Perl - 错误处理
- Perl - 特殊变量
- Perl - 编码标准
- Perl - 正则表达式
- Perl - 发送电子邮件
- Perl 高级
- Perl - 套接字编程
- Perl - 面向对象
- Perl - 数据库访问
- Perl - CGI 编程
- Perl - 包和模块
- Perl - 流程管理
- Perl - 嵌入式文档
- Perl - 函数参考
- Perl 有用资源
- Perl - 问题与解答
- Perl - 快速指南
- Perl - 有用的资源
- Perl - 讨论
Perl semctl 函数
描述
该函数控制 System V 信号量。您将需要导入 IPC:SysV 模块才能获取 CMD 的正确定义。该函数调用系统 semctl( ) 函数。
句法
以下是该函数的简单语法 -
semctl ID, SEMNUM, CMD, ARG
返回值
该函数在失败时返回 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 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& 在后台运行上述程序并编写另一个程序。这里 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.... Left.... Right.... Left.... Right.... Left.... Right.... Left.... Right.... Left....
perl_function_references.htm