bg 中 shell 的 fork 子程序是否從父程序接收 SIGSTOP 信號?
與Signal 聯機幫助頁相關:
通過 fork(2) 創建的子代繼承了其父代的信號處置的副本。在 execve(2) 期間,已處理信號的處置被重置為預設值;忽略信號的處置保持不變。
在這種情況下,如果子程序在前台或後台執行,它應該是完全不相關的。
例子:
如果我從
xterm
一個兒童 bg 程序開始shell
…xterm &
xterm
…並以類似的方式開始一個 bg 程序`ls -lR / &`
當我在 shell
ls
中停止時,程序是否停止xterm
kill -STOP [pid_of_xterm]
?
我想沒有,但我不知道為什麼。
我感謝您的幫助…
通過 fork(2) 創建的子代繼承了其父代的信號處置的副本。
這意味著子級處理信號的方式與其父級相同:它具有相同的信號處理程序和相同的忽略信號集。這並不意味著以某種方式向父級發送信號也會向子級發送信號(否則,殺死一個程序也會殺死它的所有後代……)。
一個程序可以使用信號處理程序進行程式,該處理程序將信號中繼給它的部分或全部子程序,但這並不常見。而對於SIGKILL、SIGSTOP等無法處理的信號,根本就做不到。這樣做的一個罕見情況是互動式 shell 將 SIGHUP 傳播到正在執行的作業。
在您的範例中,如果 ls 程序是 shell 的子程序,而 shell 是 xterm 的子程序,則向 xterm 程序發送 STOP 信號只會停止 xterm 程序。它對 shell 或 ls 沒有影響。在某些時候, ls 會阻止嘗試寫入終端,因為終端沒有讀取數據。這意味著
write
ls程序中的系統呼叫會花費很長時間,這與信號無關。有一種方法可以將信號傳遞給具有父子關係的一組程序,但它是由呼叫者決定的,而不是由信號的接收者決定的,並且一組程序必須是一個程序組。程序組的目的是能夠向整個 shell 作業發送信號,即使該作業由多個程序(例如管道)組成。