这到底是为什么?perl semaphore

kangqi7000 2011-09-05 03:26:58
#!/usr/bin/perl
use strict;
use IPC::SysV qw(IPC_CREAT S_IRUSR GETVAL SETVAL);
our $id;
$id= semget(1234,0,0666|IPC_CREAT);
print "$id/n";

&setval();
my $kkk=&getval();
print $kkk;
while(1) {
&lock();
print "lock";
&setval();
print "unlock";
sleep (1);
}

sub lock()
{
my $oper = pack("s!s!s!",0,-1,0);
semop($id,$oper);
}

sub unlock()
{
my $oper = pack("s!s!s!",0,1,0);
semop($id,$oper);
}
sub getval()
{
my $kkk = semctl($id,0,GETVAL,0);
return $kkk;
}
sub setval()
{
semctl($id,0,SETVAL,1);
}
上面是小弟写的程序,但是执行的时候为什么进程就睡眠了?把while循环注销了就能正常运行了,平生第一次郁闷的碰到这个事情,明白的解释下
...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 kangqi7000 的回复:]
但是执行的时候为什么进程就睡眠了?把while循环注销了就能正常运行了
[/Quote]
你的程序并没有睡眠,而是程序的输出都存在buffer里,没有输出到屏幕上。没有while的话,程序很快就结束了,这时buffer中的内容都会显示在屏幕上。

可以设定autoflush,在开头加上:
$|=1;
即可。

另外一个办法是在输出的字符串后加上换行符。即print "lock\n"...。换行符会强制清空buffer,把输出显示在屏幕上。
kangqi7000 2011-09-07
  • 打赏
  • 举报
回复
和这个没有关系,你说的没有道理!不能解决问题
fibbery 2011-09-05
  • 打赏
  • 举报
回复
信号量是用来同步 异步程序 对 资源的访问/执行的。所以,你要想测试信号量,你需要使用多线程/多进程来测试。

建议你先看看Unix编程相关的书,理解了信号量之后再实践!
kangqi7000 2011-09-05
  • 打赏
  • 举报
回复
我知道问题在sleep那里,可是这是为什么呢?
kangqi7000 2011-09-05
  • 打赏
  • 举报
回复
自己顶下,$id= semget(1234,0,0666|IPC_CREAT);这里可以修改成$id= semget(1234,1,0666|IPC_CREAT);

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧