如果shell在忙于前一个信号时收到新信号,那么shell似乎可以同时执行信号处理程序(陷阱操作)。这是一个示例脚本
handler() {
echo -n '<'
for i in a b c d e; do echo -n $i; sleep 1; done
echo -n '>'
}
trap handler USR1
...
产生以下输出
<ab<abcd<abcde>e>cde>
^ ^ ^
| | |
signal received
此行为会破坏复杂的处理程序。
我已经通过实验发现原子性可以通过子shell中的执行来实现:
trap '(handler)' USR1
<abcde><abcde>
^ ^ ^
| | |
signal received
并且foo=$(handler)
也是原子的(在某种意义上它不会被信号打断),使处理程序能够改变shell的状态。
然而,整个问题似乎是特定于Linux的:Mac OS上的bash根本不会中断处理程序。这使得我的解决方案依赖于未记录的行为来克服未记录的特定于平台的行为。这听起来并不可靠。
我无法找到有关此主题的任何知识。是否有任何标准/更好的方法来处理它?</ p>