這是怎麼回事?我認爲SIGINT將被髮送到前臺進程組。爲什麼SIGINT在這裏被抓到?
(我想,也許,該系統()正在運行一個外殼,其子進程創建一個新的進程組?任何人都可以證實這一點?)
% perl
local $SIG{INT} = sub { print "caught signal\n"; };
system('sleep', '10');
然後按ctrl + d,然後按Ctrl + c,並注意「捕獲的信號」從不打印。
我覺得這是一件簡單的事情......無論如何要解決這個問題?問題是,當通過系統結果持有ctrl + c運行一堆命令,直到所有迭代完成(因爲perl永遠不會獲得SIGINT)並且相當煩人時,通過系統結果運行一堆命令...
這怎麼能解決? (我已經測試了使用fork()的直接和明白,這個工程......這是不是一個可以接受的解決方案,在這個時候)
UPDATE:請注意,這有什麼做「沉睡」只有命令需要一些任意長的時間才能運行,這比perl周圍的命令要多得多。那麼按下ctrl + c會被髮送到命令(就像在前臺進程組中那樣),並以某種方式設法永遠不會發送給perl。
methinks我需要再次閱讀文檔: - /謝謝。 – dlamotte 2010-07-14 16:36:40
我想補充一點,你需要檢查孩子的返回值的原因是你的shell將^ c/INT傳遞給整個進程組,給perl和兒童,在這種情況下,終止你的孩子的「睡眠10」。如果你簡單地'從另一個shell中'kill -INT $ perl_pid',perl將很高興SIG_IGNore你。 – pilcrow 2010-07-14 16:49:14