+ -
当前位置:首页 → 问答吧 → 这到底是为什么?perl semaphore

这到底是为什么?perl semaphore

时间:2011-09-05

来源:互联网

Perl code
#!/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循环注销了就能正常运行了,平生第一次郁闷的碰到这个事情,明白的解释下

作者: kangqi7000   发布时间: 2011-09-05

自己顶下,$id= semget(1234,0,0666|IPC_CREAT);这里可以修改成$id= semget(1234,1,0666|IPC_CREAT);

作者: kangqi7000   发布时间: 2011-09-05

我知道问题在sleep那里,可是这是为什么呢?

作者: kangqi7000   发布时间: 2011-09-05

信号量是用来同步 异步程序 对 资源的访问/执行的。所以,你要想测试信号量,你需要使用多线程/多进程来测试。

建议你先看看Unix编程相关的书,理解了信号量之后再实践!

作者: fibbery   发布时间: 2011-09-05