加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:阻塞信号没有延迟,应该是 – >提供测试代码

发布时间:2020-12-15 23:32:21 所属栏目:大数据 来源:网络整理
导读:在我写的Perl脚本中,我遇到了一个问题,我阻塞INT和QUIT信号,在反引号中执行一个进程,然后解除对INT和QUIT信号的阻塞.我想阻止INT或QUIT到达子进程并将其终止. 该脚本在代码中的正确位置处成功阻塞和解除阻塞,但是,它不会延迟信号并执行我在阻塞模式下配置的
在我写的Perl脚本中,我遇到了一个问题,我阻塞INT和QUIT信号,在反引号中执行一个进程,然后解除对INT和QUIT信号的阻塞.我想阻止INT或QUIT到达子进程并将其终止.

该脚本在代码中的正确位置处成功阻塞和解除阻塞,但是,它不会延迟信号并执行我在阻塞模式下配置的处理程序,正如许多引用所说的那样.我知道它是解锁的,因为我可以在阻塞或解除阻塞命令之前或之后发送一个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 = GOODn"; exit; }

print "Recieving a SIGINT works heren";
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 signaln";

解决方法

我几乎可以肯定兰德尔在上面的评论中将其钉在了这一点上,但正确的测试是用strace检查以确认你希望实际发生的信号系统调用.更一般地说,在系统调用级别工作时,您希望避免与旨在抽象它们的库函数混合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读