详细解释signal和sigaction以及SIG_BLOCK
signal,此函數(shù)相對簡單一些,給定一個(gè)信號,給出信號處理函數(shù)則可,當(dāng)然,函數(shù)簡單,其功能也相對簡單許多,簡單給出個(gè)函數(shù)例子如下:
?
[cpp]?view plain?copy
當(dāng)然,實(shí)際運(yùn)用中,需要對不同到signal設(shè)定不同的到信號處理函數(shù),SIG_IGN忽略/SIG_DFL默認(rèn),這倆宏也可以作為信號處理函數(shù)。同時(shí)SIGSTOP/SIGKILL這倆信號無法捕獲和忽略。注意,經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn),signal函數(shù)也會堵塞當(dāng)前正在處理的signal,但是沒有辦法阻塞其它signal,比如正在處理SIG_INT,再來一個(gè)SIG_INT則會堵塞,但是來SIG_QUIT則會被其中斷,如果SIG_QUIT有處理,則需要等待SIG_QUIT處理完了,SIG_INT才會接著剛才處理。
?
?
sigaction,這個(gè)相對麻煩一些,函數(shù)原型如下:
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
函數(shù)到關(guān)鍵就在于struct sigaction
[cpp]?view plain?copy
?
[cpp]?view plain?copy
?
1. 阻塞,sigaction函數(shù)有阻塞的功能,比如SIGINT信號來了,進(jìn)入信號處理函數(shù),默認(rèn)情況下,在信號處理函數(shù)未完成之前,如果又來了一個(gè)SIGINT信號,其將被阻塞,只有信號處理函數(shù)處理完畢,才會對后來的SIGINT再進(jìn)行處理,同時(shí)后續(xù)無論來多少個(gè)SIGINT,僅處理一個(gè)SIGINT,sigaction會對后續(xù)SIGINT進(jìn)行排隊(duì)合并處理。
2. sa_mask,信號屏蔽集,可以通過函數(shù)sigemptyset/sigaddset等來清空和增加需要屏蔽的信號,上面代碼中,對信號SIGINT處理時(shí),如果來信號SIGQUIT,其將被屏蔽,但是如果在處理SIGQUIT,來了SIGINT,則首先處理SIGINT,然后接著處理SIGQUIT。
3.?sa_flags如果取值為0,則表示默認(rèn)行為。還可以取如下倆值,但是我沒覺得這倆值有啥用。
SA_NODEFER,如果設(shè)置來該標(biāo)志,則不進(jìn)行當(dāng)前處理信號到阻塞
SA_RESETHAND,如果設(shè)置來該標(biāo)志,則處理完當(dāng)前信號后,將信號處理函數(shù)設(shè)置為SIG_DFL行為
?
下面單獨(dú)來討論一下信號屏蔽,記住是屏蔽,不是消除,就是來了信號,如果當(dāng)前是block,則先不傳遞給當(dāng)前進(jìn)程,但是一旦unblock,則信號會重新到達(dá)。
?
[cpp]?view plain?copy
gcc -g -o mask mask.c?
?
./mask
========這個(gè)地方按多次ctrl+\
SIGQUIT unblocked
catch SIGQUIT
Quit (core dumped)
======================
注意觀察運(yùn)行結(jié)果,在sleep的時(shí)候,按多次ctrl+\,由于sleep之前block了SIG_QUIT,所以無法獲得SIG_QUIT,但是一旦運(yùn)行sigprocmask(SIG_SETMASK, &old, NULL);則unblock了SIG_QUIT,則之前發(fā)送的SIG_QUIT隨之而來。
由于信號處理函數(shù)中設(shè)置了DFL,所以再發(fā)送SIG_QUIT,則直接coredump
--------------------- 本文來自 Kevin_Smart 的CSDN 博客 ,全文地址請點(diǎn)擊:https://blog.csdn.net/davion_zhang/article/details/52247675?utm_source=copy
總結(jié)
以上是生活随笔為你收集整理的详细解释signal和sigaction以及SIG_BLOCK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京加密机现场select问题
- 下一篇: 成都欢乐谷刺激项目身高限制