1 回答

TA貢獻1752條經(jīng)驗 獲得超4個贊
我們將假設(shè)一個類Unix系統(tǒng),使用一個理解并參與工作控制的shell(他們現(xiàn)在都這樣做了)。運行命令時,shell 會創(chuàng)建一個稱為進程組或“pgroup”的東西來保存組成該命令的每個進程。如果命令是一個管道(就像這個一樣),則管道中的每個進程都會獲得相同的 pgroup-ID(請參閱 setpgid
)。
如果命令在 forgeground 中運行(不帶 ),則控制終端會分配此特定 pgid。按下其中一個信號生成鍵,例如或,使用內(nèi)部 killpg
或等效項將相應(yīng)的信號(在這些情況下)發(fā)送到 p 組。這會將信號發(fā)送到 p 組的每個成員。&
CTRL-CCTRL-\SIGINT
SIGQUIT
(后臺處理進程只是*咳嗽*,收回控制tty上的pgid,然后重新啟動管道中的進程。但是,實現(xiàn)這一目標并不是那么簡單,正如此處的“重新啟動”所示。
這里問題的可能根源是,交互式程序將控制終端置于cbreak或原始模式,并禁用來自鍵盤鍵的部分或全部信號,例如,不再導(dǎo)致內(nèi)核的tty模塊發(fā)送信號。相反,如果您看到一個密鑰應(yīng)導(dǎo)致掛起 () 或終止,則程序必須執(zhí)行自己的掛起或終止。程序員有時認為這包括簡單地掛起或終止 - 但是由于整個管道從未獲得有問題的信號,因此情況并非如此,除非整個shell管道僅由交互式程序組成。CTRL-CCTRL-Z
解決方法是讓程序在對控制終端進行任何必要的清理(臨時或永久)后將信號發(fā)送到自己的p組。
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報