1.信号处理之:kill(),alarm(),pause()函数
1查看信號的方式:man 7 signal,通過這個(gè)命令可以查看到所有信息。
2查看信號kill -l
注意,后面的32個(gè)信號表示的實(shí)時(shí)信號。
?
會(huì)發(fā)現(xiàn)一個(gè)規(guī)律,前32種信號會(huì)有各種不同的名稱,后32種會(huì)以“SIGRTMIN”或者“SIGRTMAX”開頭,前者是從unix繼承下來的信號,稱為不可靠信號(也稱為非實(shí)時(shí)信號),后者為了解決“不可靠信號”的問題進(jìn)行了更改和擴(kuò)充的信號形成了可靠信號(也稱為實(shí)時(shí)信號)
如果想要了解可靠與不可靠信號,需要了解信號的生命周期:
一個(gè)完整的信號周期可以分為三個(gè)重要階段,三個(gè)重要階段有四個(gè)重要事件刻畫的:信號產(chǎn)生,信號在進(jìn)程中注冊,信號在進(jìn)程中注銷,執(zhí)行信號處理函數(shù)
相鄰的兩個(gè)事件的時(shí)間間隔構(gòu)成了生命周期的一個(gè)階段,這里的信號處理有多種方式,一般由內(nèi)核完成,也可以由用戶進(jìn)程完成
3.man 7 signal
?
Signal dispositions
?????? Each signal has a current disposition,which determines how the process
?????? behaves when it is delivered the signal.
?
?????? The?entries? in? the?"Action"? column of thetables below specify the
?????? default disposition for each signal, asfollows:
?????? Term??Default action is to terminate the process.? 表示終止當(dāng)前線程
?????? Ign???Default action is to ignore the signal. 表示忽略該信號
?????? Core??Default action is to terminate the process and? dump?core? (see
????????????? core(5)). 表示終止當(dāng)前進(jìn)程并且Core Dump(Core Dump用于gdb調(diào)試)
?????? Stop??Default action is to stop the process. 表示停止當(dāng)前進(jìn)程
?????? Cont??Default? action? is?to? continue the process if it iscurrently
????????????? stopped. 表示繼續(xù)執(zhí)行先前停止的進(jìn)程。
信號產(chǎn)生種類:
Ctrl+C?? SIGINT
Ctrl+z?? SIGTSTP
Ctrl+\?? SIGQUIT
4.硬件異常
*除0操作
*訪問非法內(nèi)存
int kill(pid_tpid,int sig)
?? pid > 0
?????? sig發(fā)送給ID為pid的進(jìn)程
?? pid < 0
?????? sig發(fā)送給組ID為|pid|的進(jìn)程,并且發(fā)送進(jìn)程具有向其發(fā)送信號的權(quán)限
?? pid == -1
?????? sig發(fā)送給發(fā)送進(jìn)程有權(quán)限向他們發(fā)送信號的系統(tǒng)上的所有進(jìn)程為0時(shí),用于檢索,特定pid進(jìn)程是否存在,如不存在,返回-1
kill函數(shù)的語法格式:
raise()函數(shù)(自己向自己發(fā)送信號)語法要點(diǎn):
下面的例子使子進(jìn)程不在父進(jìn)程調(diào)用kill之前不退出,然后父進(jìn)程調(diào)用kill使子進(jìn)程退出:
運(yùn)行結(jié)果:
當(dāng)去掉24行時(shí),運(yùn)行的結(jié)果是:
5.alarm()、pause()
函數(shù)說明
??alarm()也稱為鬧鐘函數(shù),它可以在進(jìn)程中設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器指定的時(shí)間到時(shí),它就向進(jìn)程發(fā)送SIGALARM信號。要注意的是,一個(gè)進(jìn)程只能有一個(gè)鬧鐘時(shí)間,如果在調(diào)用alarm()之前已設(shè)置過鬧鐘時(shí)間,則任何以前的鬧鐘時(shí)間都被新值所代替。
?pause()函數(shù)用于將調(diào)用進(jìn)程掛起直至捕捉到信號為止。這個(gè)函數(shù)很常用,通常可以用于判斷信號是否已到。
函數(shù)格式
本實(shí)驗(yàn)上是完成一個(gè)簡單的sleep()函數(shù)的功能,程序如下圖
運(yùn)行結(jié)果:
注釋第9行
運(yùn)行結(jié)果:
上面一閃而得出結(jié)果。
分析:程序定時(shí)時(shí),執(zhí)行到第9行pause()時(shí),進(jìn)程會(huì)被掛起,當(dāng)計(jì)時(shí)到,發(fā)送信號SIGALARM,這時(shí)pause()捕捉到信號,進(jìn)程直接被終止。
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
再如通過alarm實(shí)現(xiàn)打印計(jì)數(shù):
總結(jié)
以上是生活随笔為你收集整理的1.信号处理之:kill(),alarm(),pause()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启动u盘系统黑屏怎么回事 U盘系统启动黑
- 下一篇: 苹果笔记本怎么安装双系统 苹果笔记本安装