Perl:阻塞信号未按预期延迟 -> 提供测试代码

5
在我编写的Perl脚本中,我遇到了一个问题:我阻止了INTQUIT信号,在反引号内执行了一个进程,然后解除了INTQUIT信号的阻止。我想要防止INTQUIT达到子进程并杀死它。
脚本成功地在代码的正确部分阻止和解除阻止,但是,它不会延迟信号并在阻塞模式下执行我配置的处理程序,就像许多参考所说的那样。我知道它解除了阻止,因为我可以在阻止或解除阻止命令之前或之后发送SIGINT,并且它会被尊重。
操作系统: Linux 2.6.30 Perl版本: 5.8.8
代码片段:
#!/usr/local/bin/perl

use POSIX qw(:signal_h);

$SIG{'INT'} = 'gracefulExit';
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; }

print "Recieving a SIGINT works here\n";
sleep 5;
my $sigset = POSIX::SigSet->new;
my $blockset = POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n";
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n";
`/bin/sleep 5`;
sigprocmask(SIG_UNBLOCK, $blockset) or die "dying at unblock...\n";
print "Recieving a SIGINT works here again [GOOD!]\n";
sleep 5;
print "Exited without receiving a signal\n";

这是哪个操作系统? - hlovdal
6
不要使用"system"或qx(也称为反引号)。它们都以大多数普通用户想要的方式设置信号。请改用fork/exec,然后您可以精确控制信号。 - Randal Schwartz
1个回答

1
我几乎可以确定Randal在上面的评论中已经解决了这个问题,但是正确的测试方法是使用strace来验证您期望发生的信号系统调用是否真的发生了。而且更一般地,在系统调用级别工作时,您要避免与旨在抽象它们的库函数混合使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接