Ubuntu

為什麼 SIGINT 不終止已停止的程序?

  • May 16, 2022

根據關於信號的 POSIX 標準(請參閱“標准信號”部分),兩者SIGKILLSIGINT都具有預設操作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

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