歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux下signal()函數詳解

linux下signal()函數詳解

日期:2017/3/3 16:24:07   编辑:關於Linux

首先說明函數指針的定義形式:

<存儲類型> 數據類型 (* 函數指針名) (參數表);

其中存儲類型一般不寫,用默認形式。可以選auto型、static型和extern型等。數據類型是指針所指向函數返回值的數據類型。參數表是指向函數的參數表。

再說明一個函數的返回值是一個函數指針(可理解為此函數A實際返回的是一個指向另一個函數B的指針)的定義形式:

<存儲類型> 數據類型 (* 函數名(參數表1))(參數表2);

表頭文件 #include<signal.h>

功 能:

設置某一信號的對應動作

函數原型 :

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

或者:typedef void(*sig_t) ( int );   sig_t signal(int signum,sig_t handler);

參數說明:

第一個參數signum指明了所要處理的信號類型,它可以取除了SIGKILL和SIGSTOP外的任何一種信號。

第二個參數handler描述了與信號關聯的動作,它可以取以下三種值:

(1)一個返回值為正數的函數地址  此函數必須在signal()被調用前申明,handler中為這個函數的名字。當接收到一個類型為sig的信號時,就執行handler 所指定的函數。這個函數應有如下形式的定義:   intfunc(int sig);   sig是傳遞給它的唯一參數。執行了signal()調用後,進程只要接收到類型為sig的信號,不管其正在執行程序的哪一部分,就立即執行func()函數。當func()函數執行結束後,控制權返回進程被中斷的那一點繼續執行。  

(2)SIGIGN   這個符號表示忽略該信號,執行了相應的signal()調用後,進程會忽略類型為sig的信號。

(3)SIGDFL   這個符號表示恢復系統對信號的默認處理。

函數說明 :   signal()會依參數signum 指定的信號編號來設置該信號的處理函數。當指定的信號到達時就會跳轉到參數handler指定的函數執行。當一個信號的信號處理函數執行時,如果進程又接收到了該信號,該信號會自動被儲存而不會中斷信號處理函數的執行,直到信號處理函數執行完畢再重新調用相應的處理函數。但是如果在信號處理函數執行時進程收到了其它類型的信號,該函數的執行就會被中斷。  

返回值: 返回先前的信號處理函數指針,如果有錯誤則返回SIG_ERR(-1)。

附加說明 :在信號發生跳轉到自定的handler處理函數執行後,系統會自動將此處理函數換回原來系統預設的處理方式,如果要改變此操作請改用sigaction()。

下面的情況可以產生Signal:

1. 按下CTRL+C產生SIGINT

2. 硬件中斷,如除0,非法內存訪問(SIGSEV)等等

3. Kill函數可以對進程發送Signal

4. Kill命令。實際上是對Kill函數的一個包裝

5. 軟件中斷。如當Alarm Clock超時(SIGURG),當Reader中止之後又向管道寫數據(SIGPIPE),等等

2 Signals:

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專用,進程超過資源限制的時候發送

1、不要使用低級的或者STDIO.H的IO函數

2、不要使用對操作

3、不要進行系統調用

4、不是浮點信號的時候不要用longjmp

5、singal函數是由ISO C定義的。因為ISO C不涉及多進程,進程組以及終端I/O等,所以他對信號的定義非常含糊,以至於對UNIX系統而言幾乎毫無用處。

備注:因為singal的語義於現實有關,所以最好使用sigaction函數替代本函數。

Copyright © Linux教程網 All Rights Reserved