訊號時軟中斷,很多比較重要的應用程式都需要處理訊號,訊號提供了一種處理非同步事件的方法。每個訊號都乙個名字,以sig開頭,在標頭檔案中定義訊號型別,都是正整數(訊號編號)。
產生訊號的條件:
(1)當使用者按某些終端鍵時,引發終端產生的訊號。
(2)硬體異常產生訊號。
(3)程序呼叫kill函式將訊號傳送給另外乙個程序或程序組。
(4)使用者用kill命令將訊號傳送給其他程序。
(5)檢測到某種軟體條件已經傳送,並將其通知有關程序時候產生訊號。
核心在訊號出現時候處理方式有:(1)忽略此訊號,(2)鋪捉訊號,(3)執行系統預設動作。
unix系統訊號如下:
其中sigkill和sigstop訊號時不能忽略和捕獲的,執行預設動作。
signal
description
sigabrt
由呼叫abort函式產生,程序非正常退出
sigalrm
用alarm函式設定的timer超時或setitimer函式設定的interval timer超時
sigbus
某種特定的硬體異常,通常由記憶體訪問引起
sigcancel
由solaris thread library內部使用,通常不會使用
sigchld
程序terminate或stop的時候,sigchld會傳送給它的父程序。預設情況下該signal會被忽略
sigcont
當被stop的程序恢復執行的時候,自動傳送
sigemt
和實現相關的硬體異常
sigfpe
數學相關的異常,如被0除,浮點溢位,等等
sigfreeze
solaris專用,hiberate或者suspended時候傳送
sighup
傳送給具有terminal的controlling process,當terminal被disconnect時候傳送
sigill
非法指令異常
siginfo
bsd signal。由status key產生,通常是ctrl+t。傳送給所有foreground group的程序
sigint
由interrupt key產生,通常是ctrl+c或者delete。傳送給所有foreground group的程序
sigio
非同步io事件
sigiot
實現相關的硬體異常,一般對應sigabrt
sigkill
無法處理和忽略。中止某個程序
siglwp
由solaris thread libray內部使用
sigpipe
在reader中止之後寫pipe的時候傳送
sigpoll
當某個事件傳送給pollable device的時候傳送
sigprof
setitimer指定的profiling interval timer所產生
sigpwr
和系統相關。和ups相關。
sigquit
輸入quit key的時候(ctrl+/)傳送給所有foreground group的程序
sigsegv
非法記憶體訪問
sigstkflt
linux專用,數學協處理器的棧異常
sigstop
中止程序。無法處理和忽略。
sigsys
非法系統呼叫
sigterm
請求中止程序,kill命令預設傳送
sigthaw
solaris專用,從suspend恢復時候傳送
sigtrap
實現相關的硬體異常。一般是除錯異常
sigtstp
suspend key,一般是ctrl+z。傳送給所有foreground group的程序
sigttin
當background group的程序嘗試讀取terminal的時候傳送
sigttou
當background group的程序嘗試寫terminal的時候傳送
sigurg
當out-of-band data接收的時候可能傳送
sigusr1
使用者自定義signal 1
sigusr2
使用者自定義signal 2
sigvtalrm
setitimer函式設定的virtual interval timer超時的時候
sigwaiting
solaris thread library內部實現專用
sigwinch
當terminal的視窗大小改變的時候,傳送給foreground group的所有程序
sigxcpu
當cpu時間限制超時的時候
sigxfsz
程序超過檔案大小限制
sigxres
solaris專用,程序超過資源限制的時候傳送
APUE第十章 訊號
同步 乙個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到搜到返回資訊才繼續執行。非同步 乙個程序在執行某個請求的時候,不需要一直等下去,而是繼續執行之後的操作,有訊息返回時系統會通知程序進行處理。同步和非同步關注的是程序之間的訊息通訊機制,區別阻塞和非...
第十章讀書筆記
本章主要講嵌入式linux的除錯技術。對於複雜的linux驅動及hal等程式庫,需要使用各種方法對其進行除錯。printk,這個函式的用法與printf函式類似,只不過printk函式執行在核心空間,printf函式執行在使用者空間。執行完相關的命令後,會要求選擇在ubuntu linux上,還是在...
第十章 訊號(十九) sleep函式
我們已經在本文許多例子裡使用了sleep函式,並在10.10節給出兩個有缺陷的實現。include unsigned int sleep unsigned int seconds 返回0或未睡眠的秒數。這個函式導致呼叫程序被掛起,直到下面某種情況發生 1 seconds指定的掛鐘時間量已經逝去 2 ...