您可以通过利用一点 perl 在任何应用程序上设置 SIGIGN 配置:
perl -e '$SIG{"USR1"} = "IGNORE"; exec(@ARGV)' realprogram realargs...
只要 realprogram 不修改信号,它就不会受到它们的影响。
这样做的原因是信号掩码由子进程自动继承,无论它们是由它自己启动fork(), exec()
还是由exec()
它自己启动。
注意:我曾尝试使用 bash 内置函数,但信号处理程序在子进程执行之前已恢复(GAH!),这不是我想要的。
没有面具:
natsu:~$ grep SigIgn /proc/$$/status
SigIgn: 0000000000384004
添加蒙版:
natsu:~$ trap '' USR1
natsu:~$ grep SigIgn /proc/$$/status
SigIgn: 0000000000384204
子进程丢失掩码:(
natsu:~$ bash
natsu:~$ grep SigIgn /proc/$$/status
SigIgn: 0000000000384004
natsu:~$ kill -USR1 $$
User defined signal 1
现在使用 perl:
natsu:~$ perl -e '$SIG{"USR1"} = "IGNORE"; exec(@_)' bash
natsu:~$ grep SigIgn /proc/$$/status
SigIgn: 0000000000384204
natsu:~$ kill -USR1 $$
natsu:~$