[Bash]:处理许多信号



我正在玩bash和信号处理程序,发现了一件有趣的事情。但我无法解释为什么会这样。

例如,我们有一个脚本test.sh,它可以做一些事情,并且可以处理SIGTERM:

trap 'echo "sig 15 rcvd" ' 15
trap 'echo "sig 10 rcvd" ' 10
while true
do
; do something
sleep 0.2
done

所以,当我向这个脚本发送一些信号时:

kill -15 <pidof test.sh>; kill -10 <pidof test.sh>

我收到的10号信号比15号信号早:

sig 10 rcvd
sig 15 rcvd

如果我发送2次信号10或15脚本只打印一次它:

kill -15 <pidof test.sh>; kill -15 <pidof test.sh>
sig 15 rcvd 

这也很奇怪:我认为这是因为我们对同一个pid有两个信号,而只有一个信号会被发送给它。或者这种行为还有其他原因?

最后一件有趣的事情是:从脚本中删除睡眠并发送两个信号:

test.sh 
trap 'echo "sig 15 rcvd" ' 15
trap 'echo "sig 10 rcvd" ' 10
while true
do
; do something
done

并向这个脚本发送一些信号:

kill -10 <pidof test.sh>; kill -15 <pidof test.sh>;
kill -10 <pidof test.sh>; kill -10 <pidof test.sh>;
kill -15 <pidof test.sh>;

我得到了意想不到的结果:

sig 10 rcvd
sig 10 rcvd
sig 15 rcvd
sig 10 rcvd
sig 10 rcvd

那么,有人能描述一下为什么会发生这种事吗?为什么bash(?)混淆信号/删除一个信号并添加其他信号??

UPD:还有一件有趣的事。脚本看起来像:

trap 'echo "sig 15 rcvd"; exit ' 15
trap 'echo "EXIT"' EXIT

在杀死-15之后,我有"sig 15 rcvd"one_answers"EXIT"。但如果我发送kill-15两次EXIT处理程序没有执行:

sig 15 rcvd
sig 15 rcvd

您的基本困惑是因为您期望从异步机制获得同步结果。

所以,当我向这个脚本发送一些信号时:

kill -15 <pidof test.sh>; kill -10 <pidof test.sh>

我收到的10号信号比15号信号早:

sig 10 rcvd 
sig 15 rcvd

这些信号没有排队。你发送第一个信号,它开始执行信号15陷阱,但在它完成之前,你立即发送信号10。该第二信号中断第一陷波器的执行。现在它执行第二次补漏白打印CCD_ 1。当第二个处理程序完成时,它恢复第一个中断的处理程序并打印sig 15 rcvd

如果我发送2次信号10或15脚本只打印一次它:

kill -15 <pidof test.sh>; kill -15 <pidof test.sh>
sig 15 rcvd

在执行信号处理程序时,信号总是被临时忽略。如果在陷阱结束之前接收到任何重复信号,则不会对其进行处理。这是标准的posix信号处理行为。

很明显,这两种行为的组合可以解释为什么在其他测试中无法轻松预测输出的顺序。

相关内容

  • 没有找到相关文章

最新更新