簡體   English   中英

C語言中的自定義信號處理程序

[英]Custom Signal Handler in C

考慮以下C代碼塊:

void TERMHandler(int sig){
 signal (sig, SIG_DFL);
}

main() { 
 pid_t pid;
 pid = fork()

if (pid == 0) { 
     signal(SIGTERM,TERMHandler);
     while(1); 
  }
else
  {  
   sleep(3);
   kill(pid,SIGTERM);
   sleep(3);
   kill(pid,SIGTERM);
  }
}

我們創建一個新進程,並在子進程(pid = 0)和父進程之間進行區分。

可以將自定義處理程序用於每種信號類型嗎? 如果是這樣,假設我們創建了一個自定義處理程序,那么如果我只使用一次信號(或者從不重置信號處理程序),那么所有信號之間就不會有任何區別,因為它只會執行我的處理程序而不考慮功能中的信號?

我想說的是:

 signal(SIGTERM,CustomHandler);
 signal(SIGTSTP,CustomHandler);
 signal(SIGHUP,CustomHandler);
 ...

當父母運行kill(pid, SomeSignal)時將執行相同的代碼?

可以將自定義處理程序用於每種信號類型嗎?

是的,可以注冊相同的自定義信號處理程序功能來處理不同類型的信號,最多可以包括所討論系統上可以捕獲的所有信號。 但是請注意,可能存在無法捕獲的已定義信號。 例如,在符合POSIX的系統上, SIGKILLSIGSTOP具有此屬性。

如果是這樣,假設我們創建了一個自定義處理程序,那么如果我只使用一次信號(或者從不重置信號處理程序),那么所有信號之間就不會有任何區別,因為它只會執行我的處理程序而不考慮功能中的信號?

信號處理程序功能在確定操作時不必考慮信號編號。 無論執行什么操作,它都可以執行相同的操作,或者像在示例功能中一樣,它可以簡單地將信號編號傳遞給其他功能。 您可能會也可能不會認為后者是前者的特例。

但是要注意,在POSIX系統上, sigaction()函數比signal()函數更可用於修改信號的位置。 在各種操作系統上,它的行為比signal()更加靈活和一致。

可以將自定義處理程序用於每種信號類型嗎?

是。 您可以為所有可以捕獲的信號安裝自定義的“信號捕獲”功能 (例如,可能不會捕獲SIGKILL和SIGSTOP。)

[I]是對的,如果我只使用一次信號(或從不重置信號處理程序),所有信號之間就不會有任何區別,因為它只會執行我的處理程序,而無需考慮函數中的信號?

這取決於您如何編碼信號捕獲功能。 系統會將捕獲到的信號傳遞給函數,因此,例如,在捕獲SIGTERM而不是SIGHUP時,同一函數可能會做一些不同的事情。 如果您的處理程序忽略其sig參數,並且通常忽略信號環境(掩碼,堆棧,處置),則可以,每次調用都將與其他調用相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM