1.信号处理之:kill(),alarm(),pause()函数
1查看信號的方式:man 7 signal,通過這個命令可以查看到所有信息。
2查看信號kill -l
注意,后面的32個信號表示的實時信號。
?
會發現一個規律,前32種信號會有各種不同的名稱,后32種會以“SIGRTMIN”或者“SIGRTMAX”開頭,前者是從unix繼承下來的信號,稱為不可靠信號(也稱為非實時信號),后者為了解決“不可靠信號”的問題進行了更改和擴充的信號形成了可靠信號(也稱為實時信號)
如果想要了解可靠與不可靠信號,需要了解信號的生命周期:
一個完整的信號周期可以分為三個重要階段,三個重要階段有四個重要事件刻畫的:信號產生,信號在進程中注冊,信號在進程中注銷,執行信號處理函數
相鄰的兩個事件的時間間隔構成了生命周期的一個階段,這里的信號處理有多種方式,一般由內核完成,也可以由用戶進程完成
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.? 表示終止當前線程
?????? Ign???Default action is to ignore the signal. 表示忽略該信號
?????? Core??Default action is to terminate the process and? dump?core? (see
????????????? core(5)). 表示終止當前進程并且Core Dump(Core Dump用于gdb調試)
?????? Stop??Default action is to stop the process. 表示停止當前進程
?????? Cont??Default? action? is?to? continue the process if it iscurrently
????????????? stopped. 表示繼續執行先前停止的進程。
信號產生種類:
Ctrl+C?? SIGINT
Ctrl+z?? SIGTSTP
Ctrl+\?? SIGQUIT
4.硬件異常
*除0操作
*訪問非法內存
int kill(pid_tpid,int sig)
?? pid > 0
?????? sig發送給ID為pid的進程
?? pid < 0
?????? sig發送給組ID為|pid|的進程,并且發送進程具有向其發送信號的權限
?? pid == -1
?????? sig發送給發送進程有權限向他們發送信號的系統上的所有進程為0時,用于檢索,特定pid進程是否存在,如不存在,返回-1
kill函數的語法格式:
raise()函數(自己向自己發送信號)語法要點:
下面的例子使子進程不在父進程調用kill之前不退出,然后父進程調用kill使子進程退出:
運行結果:
當去掉24行時,運行的結果是:
5.alarm()、pause()
函數說明
??alarm()也稱為鬧鐘函數,它可以在進程中設置一個定時器,當定時器指定的時間到時,它就向進程發送SIGALARM信號。要注意的是,一個進程只能有一個鬧鐘時間,如果在調用alarm()之前已設置過鬧鐘時間,則任何以前的鬧鐘時間都被新值所代替。
?pause()函數用于將調用進程掛起直至捕捉到信號為止。這個函數很常用,通??梢杂糜谂袛嘈盘柺欠褚训?。
函數格式
本實驗上是完成一個簡單的sleep()函數的功能,程序如下圖
運行結果:
注釋第9行
運行結果:
上面一閃而得出結果。
分析:程序定時時,執行到第9行pause()時,進程會被掛起,當計時到,發送信號SIGALARM,這時pause()捕捉到信號,進程直接被終止。
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
再如通過alarm實現打印計數:
總結
以上是生活随笔為你收集整理的1.信号处理之:kill(),alarm(),pause()函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启动u盘系统黑屏怎么回事 U盘系统启动黑
- 下一篇: 2信号处理之:信号产生原因,进程处理信号