中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux中signal函數怎么用

發布時間:2022-02-19 11:09:46 來源:億速云 閱讀:219 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Linux中signal函數怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Linux系統的信號機制最簡單的接口是signal函數。signal函數的功能:為指定的信號安裝一個新的信號處理函數。

Linux中signal函數怎么用

1. 功能

設置某一信號的對應動作

2. 聲明

#include typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

3. 參數說明

第一個參數signum:指明了所要處理的信號類型,它可以取除了SIGKILL和SIGSTOP外的任何一種信號。   第二個參數handler:描述了與信號關聯的動作,它可以取以下三種值:

?

(1)SIG_IGN

這個符號表示忽略該信號。 例如:

#include #include int main(int argc, char *argv[]) {

   signal(SIGINT, SIG_IGN);

   while(1);

   return 0;

}

SIGINT信號代表由InterruptKey產生,通常是CTRL +C 或者是DELETE 。執行上述代碼時,按下CTRL + C程序沒有反應。這就對了,如果我們想結束該程序可以按下CTRL +\來結束,當我們按下CTRL +\組合鍵時,產生了SIGQUIT信號,此信號并沒有被忽略。

?

(2)SIG_DFL

這個符號表示恢復對信號的系統默認處理。不寫此處理函數默認也是執行系統默認操作。 例如

#include #include int main(int argc, char *argv[]) {

   signal(SIGINT, SIG_DFL);

   while(1);

   return 0;

}

這時就可以按下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) {

   printf("catch signal %d\n", signum);

}



int main(int argc, char *argv[]) {

   signal(SIGINT, signal_hander_fun);

   while(1);

   return 0;

}

執行時,當我們按下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 :

SignalDescription
SIGABRT由調用abort函數產生,進程非正常退出
SIGALRM用alarm函數設置的timer超時或setitimer函數設置的interval timer超時
SIGBUS某種特定的硬件異常,通常由內存訪問引起
SIGCANCEL由Solaris Thread Library內部使用,通常不會使用
SIGCHLD進程Terminate或Stop的時候,SIGCHLD會發送給它的父進程。缺省情況下該Signal會被忽略
SIGCONT當被stop的進程恢復運行的時候,自動發送
SIGEMT和實現相關的硬件異常
SIGFPE數學相關的異常,如被0除,浮點溢出,等等
SIGFREEZESolaris專用,Hiberate或者Suspended時候發送
SIGHUP發送給具有Terminal的Controlling Process,當terminal 被disconnect時候發送
SIGILL非法指令異常
SIGINFOBSD 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的時候發送
SIGPROFSetitimer指定的Profiling Interval Timer所產生
SIGPWR和系統相關。和UPS相關。
SIGQUIT輸入Quit Key的時候(CTRL+\)發送給所有Foreground Group的進程
SIGSEGV非法內存訪問
SIGSTKFLTLinux專用,數學協處理器的棧異常
SIGSTOP中止進程。無法處理和忽略。
SIGSYS非法系統調用
SIGTERM請求中止進程,kill命令缺省發送
SIGTHAWSolaris專用,從Suspend恢復時候發送
SIGTRAP實現相關的硬件異常。一般是調試異常
SIGTSTPSuspend Key,一般是Ctrl+Z。發送給所有Foreground Group的進程
SIGTTIN當Background Group的進程嘗試讀取Terminal的時候發送
SIGTTOU當Background Group的進程嘗試寫Terminal的時候發送
SIGURG當out-of-band data接收的時候可能發送
SIGUSR1用戶自定義signal 1
SIGUSR2用戶自定義signal 2
SIGVTALRMsetitimer函數設置的Virtual Interval Timer超時的時候
SIGWAITINGSolaris Thread Library內部實現專用
SIGWINCH當Terminal的窗口大小改變的時候,發送給Foreground Group的所有進程
SIGXCPU當CPU時間限制超時的時候
SIGXFSZ進程超過文件大小限制
SIGXRESSolaris專用,進程超過資源限制的時候發

關于“Linux中signal函數怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涡阳县| 南漳县| 青海省| 剑河县| 桐乡市| 永康市| 赤城县| 福海县| 崇文区| 保山市| 登封市| 建德市| 天气| 桓台县| 陵川县| 丰顺县| 砀山县| 宝兴县| 陈巴尔虎旗| 横峰县| 册亨县| 梁河县| 榆中县| 翁牛特旗| 卓尼县| 绥化市| 延津县| 玉屏| 云林县| 聂荣县| 新巴尔虎右旗| 肥乡县| 阿拉尔市| 尼勒克县| 乡城县| 自治县| 平顶山市| 鱼台县| 永康市| 罗城| 定陶县|