这是意外情况:在以下脚本SIGALRM
中,未在预期时间调用该函数alarm()
。
#!/bin/sh -x
alarm() {
echo "alarmed!!!"
}
trap alarm 14
OUTER=$(exec sh -c 'echo $PPID')
#for arg in `ls $0`; do
ls $0 | while read arg; do
INNER=$(exec sh -c 'echo $PPID')
# child A, the timer
sleep 1 && kill -s 14 $$ &
# child B, some other scripts
sleep 60 &
wait $!
done
预期:1 秒后,alarm()
应该调用该函数。
实际上:
alarm()
被调用到 60 年代,或者当我们点击Ctrl+时C。
我们知道在脚本中,$$
实际上指示了OUTER
进程,所以我想我们应该在 1 秒后看到字符串打印到屏幕上。然而,直到孩子 B 退出我们才看到alarm()
被调用。
当我们得到trap
注释时,整个程序在 1 秒后终止。所以......我想SIGALRM
至少收到了,但为什么它不调用动作?
而且,作为一个附带问题,默认行为SIGALRM
是终止吗?从这里我被告知默认情况下它被忽略,那么为什么OUTER
在收到它后退出呢?