信號(hào)是發(fā)生某件事時(shí)對(duì)進(jìn)程的通知,它不可以被預(yù)知,
unix關(guān)于信號(hào)、信號(hào)處理函數(shù)
。信號(hào)可以來自其它進(jìn)程或者進(jìn)程本身,也可以是來自內(nèi)核。每個(gè)信號(hào)都有一個(gè)處理辦法(disposition),也稱作與信號(hào)關(guān)聯(lián)的行為(action),一般有三種處理方法:
1 提供一個(gè)函數(shù)(signal handler),在信號(hào)發(fā)生時(shí)調(diào)用,這稱之為捕獲(catching)。
2 設(shè)置信號(hào)的處理辦法為SIG_IGN,忽略它,但有兩種信號(hào)是不能忽略的:SIGKILL、SIGSTOP。
3 SIG_DFL可以設(shè)置缺省處理辦法,一般是收到信號(hào)時(shí)終止進(jìn)程。當(dāng)然,也可以忽略它們,例如SIGCHLD和SIGURG。
POSIX中定義信號(hào)處理函數(shù)用sigaction函數(shù),處理函數(shù)的指針做為填充在做為參數(shù)之一的struct sigaction結(jié)構(gòu)中,當(dāng)然還有函數(shù)所對(duì)應(yīng)的需要處理的信號(hào),原型如下:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
UNP中為sigaction做了一個(gè)包裹函數(shù):
Sigfunc *signal(int signo, Sigfunc *func);
它與非POSIX的signal函數(shù)一致,就是向操作系統(tǒng)登記要處理的信號(hào),
電腦資料
《unix關(guān)于信號(hào)、信號(hào)處理函數(shù)》(http://salifelink.com)。信號(hào)處理函數(shù)在登記完成后便一直有效。信號(hào)處理函數(shù)在執(zhí)行時(shí),可以通過設(shè)置sa_mask來指定要屏蔽的其實(shí)信號(hào)。此時(shí)被屏蔽(阻塞)的信號(hào)是不排隊(duì)的。當(dāng)然,在實(shí)時(shí)UNIX系統(tǒng)中不會(huì)阻塞信號(hào),所有的信號(hào)排隊(duì)接受處理。UNIX對(duì)信號(hào)的處理不排隊(duì),這個(gè)特性就是說:當(dāng)同時(shí)有若干個(gè)信號(hào),只捕獲第一個(gè),其它的就被拋棄了。可以想像一個(gè)服務(wù)器同時(shí)連接著很多客戶機(jī),當(dāng)若干個(gè)客戶同時(shí)斷開連接,服務(wù)器處理這些客戶的進(jìn)程結(jié)束后幾乎同時(shí)向父進(jìn)程發(fā)送SIGCHLD信號(hào)。只有第一個(gè)SIGCHLD被處理了,其它的信號(hào)會(huì)屏蔽掉,子進(jìn)程仍會(huì)處于僵尸狀態(tài)(Zombie)。
處理這種情況要使用waitpid函數(shù),它比wait提供更多控制機(jī)制,下面就是一個(gè)典型的SIGCHLD信號(hào)處理函數(shù):
cpp 代碼復(fù)制內(nèi)容到剪貼板