Signal ()函數詳細介紹 Linux函數(轉)

Signal ()函數詳細介紹 Linux函數
收藏人:紫火神兵    
2012-09-27 | 閱:5659  轉:22  
 |    來源
  |  分享 
 
 
 
  
 
 

signal()函數理解css

在<signal.h> 這個頭文件中。html

signal(參數1,參數2);異步

參數1:咱們要進行處理的信號。系統的信號咱們能夠再終端鍵入 kill -l查看(共64個)。其實這些信號時系統定義的宏。函數

參數2:咱們處理的方式(是系統默認仍是忽略仍是捕獲)。ui

通常有3中方式進行操做。spa

(1)eg: signal(SIGINT ,SIG_ING );.net

//SIG_ING 表明忽略SIGINT信號,SIGINT信號表明由InterruptKey產生,一般是CTRL +C 或者是DELETE 。發送給全部ForeGround Group的進程。指針

下面咱們寫個死循環:調試


 

這時咱們保存執行。htm

按下CTRL _C程序沒有反應。這就對了

若是咱們想結束該程序能夠按下CTRL +\來結束

其實當咱們按下CTRL +\組合鍵時,是產生了SIGQUIT信號

(2)eg: signal(SIGINT ,SIG_DFL );

//SIGINT信號表明由InterruptKey產生,一般是CTRL +C或者是DELETE。發送給全部ForeGroundGroup的進程。 SIG_DFL表明執行系統默認操做,其實對於大多數信號的系統默認動做時終止該進程。這與不寫此處理函數是同樣的。

 

咱們將上面的程序改爲


這時就能夠按下CTRL +C 來終止該進程了。把signal(SIGINT,SIG_DFL);這句去掉,效果是同樣的。

(3) void ( *signal( int sig, void (* handler)( int )))( int );
int (*p)();
這是一個函數指針, p所指向的函數是一個不帶任何參數, 而且返回值爲int的一個函數.
int (*fun())();
這個式子與上面式子的區別在於用fun()代替了p,而fun()是一個函數,因此說就能夠當作是fun()這個函數執行以後,它的返回值是一個函數指針,這個函數指針(其實就是上面的p)所指向的函數是一個不帶任何參數,而且返回值爲int的一個函數.

void (*signal(int signo, void (*handler)(int)))(int);就能夠當作是signal()函數(它本身是帶兩個參數,一個爲整型,一個爲函數指針的函數),而這個signal()函數的返回值也爲一個函數指針,這個函數指針指向一個帶一個整型參數,而且返回值爲void的一個函數.

在寫信號處理函數時對於信號處理的函數也是void sig_fun(int signo);這種類型,剛好與上面signal()函數所返回的函數指針所指向的函數是同樣的.void ( *signal() )( int );

signal是一個函數, 它返回一個函數指針, 後者所指向的函數接受一個整型參數 且沒有返回值, 仔細看, 是否是siganal( int signo, void (*handler)(int) )的第2個參數了,對了,其實他所返回的就是signal的第2個信號處理函數,指向信號處理函數,就能夠執行函數了( signal內部時, signal把信號作爲參數傳遞給handler信號處理函數,接着 signal函數返回指針, 而且又指向信號處理函數, 就開始執行它)

那麼,signal函數的參數又是如何呢?signal函數接受兩個參數:一個整型的信號編號,以及一個指向用戶定義的信號處理函數的指針。咱們此前已經定義了指向用戶定義的信號處理函數的指針sfp:

 

void (*sfp)(int);

 

 

 

sfp 的類型能夠經過將上面的聲明中的sfp去掉而獲得,即void (*)(int)。此外,signal函數的返回值是一個指向調用前的用戶定義信號處理函數的指針,這個指針的類型與sfp指針類型一致。所以,咱們能夠以下聲明signal函數:

 

void (*signal(int, void(*)(int)))(int);

 

 

 

一樣地,使用typedef能夠簡化上面的函數聲明:

 

typedef void (*HANDLER)(int);
HANDLER signal(int, HANDLER);

 

 

 

Ok;看個例子:


此程序是對當咱們按下CTRL +C鍵時,會執行咱們定義的信號處理函數。

 

 

每當咱們按下CTRL +C鍵時會打印該信號的number.能夠看出該信號的num爲2

要想退出能夠按下CTRL +\ 打印結果爲最後一行。

 

一些經常使用的Signal 以下:

注:下面是從百度文庫中找的(*^__^*) 嘻嘻……

 

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專用,進程超過資源限制的時候發送
相關文章
相關標籤/搜索