sno*_*kin 5 linux perl posix signals
!/usr/bin/env perl
use POSIX;
my $sig_set = POSIX::SigSet->new(POSIX::SIGINT);
my $sig_act = POSIX::SigAction->new(sub { print "called\n"; exit 0 },$sig_set);
POSIX::sigaction(SIGINT,$sig_act);
sleep(15);
Run Code Online (Sandbox Code Playgroud)
POSIX::SigSet
如果我已经说出POSIX::sigaction
我想要的话,为什么需要使用SIGINT
?
基本上我试图用我的coderef来响应我添加到SigSet的每个信号,看着POSIX::sigaction
签名,它必须接受一个信号作为第一个参数,如果我已经告诉POSIX::SigAction
我的话,这似乎是不合理的POSIX::SigSet
.
我确定我在这里遗漏了一些东西.
谢谢,
POSIX :: SigSet指定在执行信号处理程序子期间屏蔽(忽略)的其他信号.它对应于sa_mask
传递给C版本sigaction
的底层结构的成员.
现在,除非您通过SA_NODEFER明确请求,否则默认情况下将屏蔽SIGINT(以及sigaction的第一个参数).
但是,如果你只想注册一个信号处理程序,它的执行不会被注册的信号中断(例如,在SIGINT处理程序中不允许SIGINT),你可以完全跳过POSIX模块:
$SIG{INT} = sub { print "called\n"; exit 0; }; # Won't be interrupted by SIGINT
Run Code Online (Sandbox Code Playgroud)
在可能的情况下,Perl的信号调度模拟了在处理程序执行期间阻塞信号的传统UNIX语义.(在Linux上,它肯定可以.sigprocmask()在执行处理程序之前被调用,然后注册作用域保护功能以在用户提供的子句末尾重新允许该信号.)
归档时间: |
|
查看次数: |
437 次 |
最近记录: |