2010-10-03 39 views
4

當我從父母那裏撥打kill(Child_PID, SIGSTOP);時,我希望孩子停止執行,並且父母繼續。這是預期的行爲,還是我必須顯式聲明子級中的SIGSTOP處理程序?我到處搜索,無法找到這些信息。將SIGSTOP發送給子進程會停止所有執行。 C

謝謝。 Braden

+0

我遇到過這類問題。嘗試運行'ps',看看它是否真的停止了(它應該)。我懷疑你應該在你的'waitpid()'中添加'WUNTRACED'來檢測你主進程中停止的子進程。 – 2018-01-17 11:03:37

回答

1

這是預期的行爲。

使用strace your_program來查看發生了什麼。

2

POSIX說:

系統應不允許過程捕捉的信號SIGKILL和SIGSTOP。

因此,孩子沒有選擇,只能停止 - 如果信號發送成功。而且您不能在子進程(或父進程或其他進程)中設置SIGSTOP處理程序。

+0

好吧,我在程序上運行strace並觀察孩子,一旦發出殺死請求,所有執行都停止,它不會退出,而是停止。 – Braden 2010-10-03 20:31:03

+0

@Braden:那是因爲你使用了'SIGSTOP'而不是'SIGKILL'或其他任何信號。那是預期的行爲。 – Hasturkun 2010-10-03 20:54:36

+0

@Braden:你還期望什麼? SIGSTOP說「停止執行;進入假死狀態,直到進一步通知」,其中'進一步通知'是一個SIGCONT信號(或可能是一個SIGKILL信號)。 – 2010-10-03 20:57:11

2

這是預期的行爲。從unix手冊頁引用:

信號SIGKILL和SIGSTOP不能被捕獲,阻塞或忽略。

和BSD手冊頁提到:

信號()函數將失敗,如果不採取行動將發生 下列之一發生:

[EINVAL]   The sig argument is not a valid signal number. 
[EINVAL]   An attempt is made to ignore or supply a handler 
        for SIGKILL or SIGSTOP. 

總而言之,您不允許爲SIGSTOP安裝處理程序。並且該過程將保持暫停狀態,直到它收到SIGCONT

相關問題