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()函數用于将調用程序挂起直至捕捉到信号為止。這個函數很常用,通常可以用于判斷信号是否已到。
函數格式
<a target="_blank" href="http://img.ddvip.com/2013/0620/201306200527151210.gif"></a>
<a target="_blank" href="http://img.ddvip.com/2013/0620/201306200527154822.gif"></a>
本實驗上是完成一個簡單的sleep()函數的功能,程式如下圖
注釋第9行
上面一閃而得出結果。
分析:程式定時時,執行到第9行pause()時,程序會被挂起,當計時到,發送信号sigalarm,這時pause()捕捉到信号,程序直接被終止。
再如通過alarm實作列印計數: