以下是意外情況:在以下腳本中,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