perl 里面的信号处理很简单,就是给 %SIG 这个 hash 赋值就好了。前几天遇到个问题,处理 SIG{CHLD} 的时候,我本来只起一个 child 进程,可是发现这个信号会被触发多次,开始弄不明白,后来偶然想到是不是 system,exec 之类的函数弄出来的,搜了下果然。
perl 里面调用外部命令是会 fork 一个子进程的,所以也会触发那个信号,想避免可以设置局部变量,例如
使用 {} 来构造局部变量的方法有时候会让问题变的非常简单。
另外,信号触发的时候,会把 sleep 中断,这个在 sleep 的 doc 里面说的很明白。如果还是想 sleep 到足够的时间,可以用下面的方法。
越来越感觉写 perl 还是很给力的,很多的奇技淫巧,不过我现在也是属于没弄明白多少,瞎写。
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 还是很给力的,很多的奇技淫巧,不过我现在也是属于没弄明白多少,瞎写。