以下是意外情况:在以下脚本中,SIGALRM
未在预期时间调用函数alarm()
。SIGALRM等待子壳程序?
#!/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 +Ç。
我们知道在脚本中,$$
实际上表示的是OUTER
进程,所以我想我们应该在1秒后看到打印到屏幕的字符串。然而,直到小孩B退出,我们才看到alarm()
被调用。
当我们得到trap
行的评论时,整个程序仅在1秒后终止。所以...我想SIGALRM
至少已经收到,但为什么它不会调用动作?
而作为一个侧面问题,SIGALRM
的默认行为是终止?从here我被告知,默认情况下它会被忽略,那么为什么OUTER
在收到后会退出?
这个程序的实际目标是什么? –
@JohnZwinck我的实际目标是创建两个子进程并相互控制:如果第二个子进程超时,第一个子进程将发送SIGALARM到主进程来杀死第二个子进程;如果第一个孩子退出,第二个孩子会杀死第一个孩子。实际上,我已经完成了这个目标,但在这里我试图在测试过程中重现一个意想不到的情况。 – sleepsort
我看你有'睡60&'..你怎么知道这不是在睡这个过程? – Bill