Ubuntu
為什麼 SIGINT 不終止已停止的程序?
根據關於信號的 POSIX 標準(請參閱“標准信號”部分),兩者
SIGKILL
和SIGINT
都具有預設操作Term。但是,當接收過程已通過SIGSTOP
(或SIGTSTP
)停止時,情況似乎並非如此。為了簡單起見,假設我創建了一個無限循環的程序:
int main(){ while(1); }
編譯並執行它
$ ./program
然後我按下
Ctrl``Z
停止它。這會導致將SIGTSTP
信號傳遞給該程序。現在,如果我SIGINT
通過 向程序發送信號kill -SIGINT pid
,並查看程序表:ps -aux
,我發現它沒有被終止。但是,如果我發送kill -SIGKILL pid
它確實會終止。如果它們都具有相同的預設操作(即Term ),為什麼
SIGINT
它們的行為方式不同?SIGKILL
SIGKILL
預設情況下會終止一個程序並且不能被阻塞,而SIGINT
預設情況下會終止一個程序但可以被阻塞。Ctrl``Z
由於您使用(SIGTSTP
)將程序移至後台,因此SIGINT
信號將被阻止,並且僅在程序恢復執行 ( ) 後才會傳遞給程序SIGCONT
。