wd and cc

— Happy every day

perl 里面的信号处理

Posted at — Jan 1, 2011
perl 里面的信号处理很简单,就是给 %SIG 这个 hash 赋值就好了。前几天遇到个问题,处理 SIG{CHLD} 的时候,我本来只起一个 child 进程,可是发现这个信号会被触发多次,开始弄不明白,后来偶然想到是不是 system,exec 之类的函数弄出来的,搜了下果然。
perl 里面调用外部命令是会 fork 一个子进程的,所以也会触发那个信号,想避免可以设置局部变量,例如
$SIG{CHLD} = sub {
    print "main\n";
};

.....
{
    local $SIG{CHLD} = undef; # 注意调用外部命令的时候,如果 IGNORE 就捕捉不了结果了
    `mv xxx yyy`;
    system(xxxxx);
}

.....

使用 {} 来构造局部变量的方法有时候会让问题变的非常简单。
另外,信号触发的时候,会把 sleep 中断,这个在 sleep 的 doc 里面说的很明白。如果还是想 sleep 到足够的时间,可以用下面的方法。
my $timeLeft = 10;
while ( 1 ) {
    last if $timeLeft <= 0;
    my $actTime = sleep($timeLeft);
    $timeLeft = $timeLeft - $actTime;
}

越来越感觉写 perl 还是很给力的,很多的奇技淫巧,不过我现在也是属于没弄明白多少,瞎写。
comments powered by Disqus