[英]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的系統上, SIGKILL
和SIGSTOP
具有此屬性。
如果是這樣,假設我們創建了一個自定義處理程序,那么如果我只使用一次信號(或者從不重置信號處理程序),那么所有信號之間就不會有任何區別,因為它只會執行我的處理程序而不考慮功能中的信號?
信號處理程序功能在確定操作時不必考慮信號編號。 無論執行什么操作,它都可以執行相同的操作,或者像在示例功能中一樣,它可以簡單地將信號編號傳遞給其他功能。 您可能會也可能不會認為后者是前者的特例。
但是要注意,在POSIX系統上, sigaction()
函數比signal()
函數更可用於修改信號的位置。 在各種操作系統上,它的行為比signal()
更加靈活和一致。
可以將自定義處理程序用於每種信號類型嗎?
是。 您可以為所有可以捕獲的信號安裝自定義的“信號捕獲”功能 。 (例如,可能不會捕獲SIGKILL和SIGSTOP。)
[I]是對的,如果我只使用一次信號(或從不重置信號處理程序),所有信號之間就不會有任何區別,因為它只會執行我的處理程序,而無需考慮函數中的信號?
這取決於您如何編碼信號捕獲功能。 系統會將捕獲到的信號傳遞給函數,因此,例如,在捕獲SIGTERM而不是SIGHUP時,同一函數可能會做一些不同的事情。 如果您的處理程序忽略其sig
參數,並且通常忽略信號環境(掩碼,堆棧,處置),則可以,每次調用都將與其他調用相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.