Shell

bg 中 shell 的 fork 子程序是否從父程序接收 SIGSTOP 信號?

  • November 25, 2016

Signal 聯機幫助頁相關:

通過 fork(2) 創建的子代繼承了其父代的信號處置的副本。在 execve(2) 期間,已處理信號的處置被重置為預設值;忽略信號的處置保持不變。

在這種情況下,如果子程序在前台或後台執行,它應該是完全不相關的。

例子:

如果我從xterm一個兒童 bg 程序開始shell

xterm &

xterm…並以類似的方式開始一個 bg 程序

`ls -lR / &`

當我在 shellls中停止時,程序是否停止xterm

kill -STOP [pid_of_xterm]

?

我想沒有,但我不知道為什麼。

我感謝您的幫助…

通過 fork(2) 創建的子代繼承了其父代的信號處置的副本。

這意味著子級處理信號的方式與其父級相同:它具有相同的信號處理程序和相同的忽略信號集。這並不意味著以某種方式向父級發送信號也會向子級發送信號(否則,殺死一個程序也會殺死它的所有後代……)。

一個程序可以使用信號處理程序進行程式,該處理程序將信號中繼給它的部分或全部子程序,但這並不常見。而對於SIGKILL、SIGSTOP等無法處理的信號,根本就做不到。這樣做的一個罕見情況是互動式 shell 將 SIGHUP 傳播到正在執行的作業。

在您的範例中,如果 ls 程序是 shell 的子程序,而 shell 是 xterm 的子程序,則向 xterm 程序發送 STOP 信號只會停止 xterm 程序。它對 shell 或 ls 沒有影響。在某些時候, ls 會阻止嘗試寫入終端,因為終端沒有讀取數據。這意味著writels程序中的系統呼叫會花費很長時間,這與信號無關。

有一種方法可以將信號傳遞給具有父子關係的一組程序,但它是由呼叫者決定的,而不是由信號的接收者決定的,並且一組程序必須是一個程序組。程序組的目的是能夠向整個 shell 作業發送信號,即使該作業由多個程序(例如管道)組成。

引用自:https://unix.stackexchange.com/questions/325852