linux下signal 函式詳解

2021-10-08 21:59:30 字數 3862 閱讀 2074

設定某一訊號的對應動作

#include

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

第乙個引數signum:指明了所要處理的訊號型別,它可以取除了sigkill和sigstop外的任何一種訊號。  

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

(1)sig_ign

這個符號表示忽略該訊號。

例如:#include

#include

int main(int argc, char *ar**)

sigint訊號代表由interruptkey產生,通常是ctrl +c 或者是delete 。執行上述**時,按下ctrl + c程式沒有反應。這就對了,如果我們想結束該程式可以按下ctrl +\來結束,當我們按下ctrl +\組合鍵時,產生了sigquit訊號,此訊號並沒有被忽略。

(2)sig_dfl

這個符號表示恢復對訊號的系統預設處理。不寫此處理函式預設也是執行系統預設操作。

例如#include

#include

int main(int argc, char *ar**)

這時就可以按下ctrl +c 來終止該程序了。把signal(sigint, sig_dfl);這句去掉,效果是一樣的

(3)sighandler_t型別的函式指標

上面提到了sighandler_t型別宣告:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

此函式必須在signal()被呼叫前申明,handler中為這個函式的名字。當接收到乙個型別為sig的訊號時,就執行handler 所指定的函式。(int)signum是傳遞給它的唯一引數。執行了signal()呼叫後,程序只要接收到型別為sig的訊號,不管其正在執行程式的哪一部分,就立即執行func()函式。當func()函式執行結束後,控制權返回程序被中斷的那一點繼續執行。

例如#include

#include

typedef void (*signal_handler)(int);

void signal_handler_fun(int signum)

int main(int argc, char *ar**)

執行時,當我們按下ctrl +c鍵時,會執行我們定義的訊號處理函式。

catch signal 2

catch signal 2

catch signal 2

catch signal 2

=退出每當我們按下ctrl +c鍵時會列印該訊號的number.可以看出該訊號的num為2。要想退出可以按下ctrl +\ 列印結果為最後一行。

4. 函式說明

signal()會依引數signum 指定的訊號編號來設定該訊號的處理函式。當指定的訊號到達時就會跳轉到引數handler指定的函式執行。

當乙個訊號的訊號處理函式執行時,如果程序又接收到了該訊號,該訊號會自動被儲存而不會中斷訊號處理函式的執行,直到訊號處理函式執行完畢再重新呼叫相應的處理函式。但是如果在訊號處理函式執行時程序收到了其它型別的訊號,該函式的執行就會被中斷。

5. 返回值

返回先前的訊號處理函式指標,如果有錯誤則返回sig_err(-1)。

6. 一些常用的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

無法處理和忽略。中止某個程序

sigpipe

在reader中止之後寫pipe的時候傳送

sigpoll

當某個事件傳送給pollable device的時候傳送

sigprof

setitimer指定的profiling interval timer所產生

sigpwr

和系統相關。和ups相關

sigquit

輸入quit key的時候(ctrl+\)傳送給所有foreground group的程序

sigse**

非法記憶體訪問

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

si**talrm

setitimer函式設定的virtual interval timer超時的時候

sigwaiting

solaris thread library內部實現專用

sigwinch

當terminal的視窗大小改變的時候,傳送給foreground group的所有程序

sigxcpu

當cpu時間限制超時的時候

sigxfsz

程序超過檔案大小限制

sigxres solaris專用

程序超過資源限制的時候發

linux 訊號 signal函式

include include include include include include include signal 函式有iso c定義,因為iso c 不涉及多執行緒 程序組以及終端i o等,所以它對訊號的定義非常含糊,以至於對於unix系統而言毫無作用。最好用sigactioan來代替...

Linux下訊號signal詳解

訊號又稱軟中斷訊號,是程序之間傳遞資訊的一種方式,訊號傳遞過程中不僅可以傳遞資訊,還可以附加傳遞一些資料資訊或其他內容.訊號按照可靠性可分為,可靠訊號和不可靠訊號 不可靠訊號 訊號傳遞過程中有可能丟失的訊號為不可靠訊號,在作業系統早期發展過程中,unix的訊號都是不可靠訊號,在後期發展過程中,lin...

Signal 函式詳細介紹 Linux函式

include 提供型別pid t的定義 include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒...