pause
pause函數(shù)使調(diào)用進(jìn)程掛起直到有信號(hào)遞達(dá)!
int pause(void);
處理方式:
? ? ???? 如果信號(hào)的處理動(dòng)作是終止進(jìn)程,則進(jìn)程終止,pause函數(shù)沒(méi)有機(jī)會(huì)返回;
? ????? 如果信號(hào)的處理動(dòng)作是忽略,則進(jìn)程繼續(xù)處于掛起狀態(tài),pause不返回;
? ? ???? 如果信號(hào)的處理動(dòng)作是捕捉,則調(diào)用了信號(hào)處理函數(shù)之后pause返回-1,errno設(shè)置為EINTR。
? ????? 所以pause只有出錯(cuò)的返回值(類(lèi)似exec函數(shù)家族)。錯(cuò)誤碼EINTR表示“被信號(hào)中斷”。
信號(hào)操作集函數(shù)
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
前四個(gè)函數(shù)都是成功返回0,出錯(cuò)返回-1;
sigismember是一個(gè)布爾函數(shù),用于判斷一個(gè)信號(hào)集的有效信號(hào)中是否包含某種信號(hào),若包含則返回1,不包含則返回0,出錯(cuò)返回-1。
注意,在使用sigset_t類(lèi)型的變量之前,一定要調(diào) 用sigemptyset或sigfillset做初始化,使信號(hào)集處于確定的狀態(tài)。
sigprocmask函數(shù)
調(diào)用函數(shù)sigprocmask可以讀取或更改進(jìn)程的信號(hào)屏蔽字(阻塞信號(hào)集)。
nt sigprocmask(int how, const sigset_t *set, sigset_t *oset);
如果oset是非空指針,則讀取進(jìn)程的當(dāng)前信號(hào)屏蔽字通過(guò)oset參數(shù)傳出。
如果set是非空指針,則 更改進(jìn)程的信號(hào)屏蔽字?,
參數(shù)how指示如何更改,如果oset和set都是非空指針,則先將原來(lái)的信號(hào) 屏蔽字備份到?oset里,然后根據(jù)set和how參數(shù)更改信號(hào)屏蔽字。
? ?? ?????假設(shè)當(dāng)前的信號(hào)屏蔽字為mask,下表說(shuō)明了how參數(shù)的可選值。
返回值:若成功則為0,若出錯(cuò)則為-1
如果調(diào)用sigprocmask解除了對(duì)當(dāng)前若干個(gè)未決信號(hào)的阻塞,則在sigprocmask返回前,至少將其中 一個(gè)信號(hào)遞達(dá)。
sigpending函數(shù)
int sigpending(sigset_t *set);
sigpending讀取當(dāng)前進(jìn)程的未決信號(hào)集,通過(guò)set參數(shù)傳出。調(diào)用成功則返回0,出錯(cuò)則返回-1。
上述函數(shù)的運(yùn)用
該代碼的功能:
(1)先添加2號(hào)信號(hào)到阻塞信號(hào)集中;
(2)用sigprocmask函數(shù)檢測(cè)阻塞信號(hào)集;
(3)接下來(lái)一直讀取未決信號(hào)集,并打印未決信號(hào)集(打印信號(hào)集是沒(méi)有任何意義的,這里只是演示)
(4)10s之前,2號(hào)信號(hào)被設(shè)置為了阻塞狀態(tài),所以當(dāng)產(chǎn)生2號(hào)信號(hào)時(shí),它將會(huì)一直處于未決狀態(tài),不能被遞達(dá),10s后,恢復(fù)原來(lái)的阻塞信號(hào)集,2號(hào)信號(hào)的阻塞狀態(tài)被解除,所以再按Ctrl+C,將會(huì)終止進(jìn)程;
?打印未決信號(hào)集: