日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下signal()函数超详细介绍

發(fā)布時間:2025/6/15 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下signal()函数超详细介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 功能

設(shè)置某一信號的對應(yīng)動作


2. 聲明

#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);


3. 參數(shù)說明 

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

(1)SIG_IGN   

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

#include <stdio.h> #include <signal.h> int main(int argc, char *argv[]) {signal(SIGINT, SIG_IGN);while(1);return 0; }

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

(2)SIG_DFL   

這個符號表示恢復對信號的系統(tǒng)默認處理。不寫此處理函數(shù)默認也是執(zhí)行系統(tǒng)默認操作。?
例如

#include <stdio.h> #include <signal.h> int main(int argc, char *argv[]) {signal(SIGINT, SIG_DFL);while(1);return 0; }

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

(3)sighandler_t類型的函數(shù)指針?
  ?
上面提到了sighandler_t類型聲明:

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

此函數(shù)必須在signal()被調(diào)用前申明,handler中為這個函數(shù)的名字。當接收到一個類型為sig的信號時,就執(zhí)行handler 所指定的函數(shù)。(int)signum是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進程只要接收到類型為sig的信號,不管其正在執(zhí)行程序的哪一部分,就立即執(zhí)行func()函數(shù)。當func()函數(shù)執(zhí)行結(jié)束后,控制權(quán)返回進程被中斷的那一點繼續(xù)執(zhí)行。?
例如

#include <stdio.h> #include <signal.h> 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; }

執(zhí)行時,當我們按下CTRL +C鍵時,會執(zhí)行我們定義的信號處理函數(shù)。

catch signal 2 catch signal 2 catch signal 2 catch signal 2 =退出

每當我們按下CTRL +C鍵時會打印該信號的number.可以看出該信號的num為2。要想退出可以按下CTRL +\ 打印結(jié)果為最后一行。


4. 函數(shù)說明 

signal()會依參數(shù)signum 指定的信號編號來設(shè)置該信號的處理函數(shù)。當指定的信號到達時就會跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。

當一個信號的信號處理函數(shù)執(zhí)行時,如果進程又接收到了該信號,該信號會自動被儲存而不會中斷信號處理函數(shù)的執(zhí)行,直到信號處理函數(shù)執(zhí)行完畢再重新調(diào)用相應(yīng)的處理函數(shù)。但是如果在信號處理函數(shù)執(zhí)行時進程收到了其它類型的信號,該函數(shù)的執(zhí)行就會被中斷。


5. 返回值

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


6. 一些常用的Signal :

SignalDescription
SIGABRT由調(diào)用abort函數(shù)產(chǎn)生,進程非正常退出
SIGALRM用alarm函數(shù)設(shè)置的timer超時或setitimer函數(shù)設(shè)置的interval timer超時
SIGBUS某種特定的硬件異常,通常由內(nèi)存訪問引起
SIGCANCEL由Solaris Thread Library內(nèi)部使用,通常不會使用
SIGCHLD進程Terminate或Stop的時候,SIGCHLD會發(fā)送給它的父進程。缺省情況下該Signal會被忽略
SIGCONT當被stop的進程恢復運行的時候,自動發(fā)送
SIGEMT和實現(xiàn)相關(guān)的硬件異常
SIGFPE數(shù)學相關(guān)的異常,如被0除,浮點溢出,等等
SIGFREEZESolaris專用,Hiberate或者Suspended時候發(fā)送
SIGHUP發(fā)送給具有Terminal的Controlling Process,當terminal 被disconnect時候發(fā)送
SIGILL非法指令異常
SIGINFOBSD signal。由Status Key產(chǎn)生,通常是CTRL+T。發(fā)送給所有Foreground Group的進程
SIGINT由Interrupt Key產(chǎn)生,通常是CTRL+C或者DELETE。發(fā)送給所有ForeGround Group的進程
SIGIO異步IO事件
SIGIOT實現(xiàn)相關(guān)的硬件異常,一般對應(yīng)SIGABRT
SIGKILL無法處理和忽略。中止某個進程
SIGLWP由Solaris Thread Libray內(nèi)部使用
SIGPIPE在reader中止之后寫Pipe的時候發(fā)送
SIGPOLL當某個事件發(fā)送給Pollable Device的時候發(fā)送
SIGPROFSetitimer指定的Profiling Interval Timer所產(chǎn)生
SIGPWR和系統(tǒng)相關(guān)。和UPS相關(guān)。
SIGQUIT輸入Quit Key的時候(CTRL+\)發(fā)送給所有Foreground Group的進程
SIGSEGV非法內(nèi)存訪問
SIGSTKFLTLinux專用,數(shù)學協(xié)處理器的棧異常
SIGSTOP中止進程。無法處理和忽略。
SIGSYS非法系統(tǒng)調(diào)用
SIGTERM請求中止進程,kill命令缺省發(fā)送
SIGTHAWSolaris專用,從Suspend恢復時候發(fā)送
SIGTRAP實現(xiàn)相關(guān)的硬件異常。一般是調(diào)試異常
SIGTSTPSuspend Key,一般是Ctrl+Z。發(fā)送給所有Foreground Group的進程
SIGTTIN當Background Group的進程嘗試讀取Terminal的時候發(fā)送
SIGTTOU當Background Group的進程嘗試寫Terminal的時候發(fā)送
SIGURG當out-of-band data接收的時候可能發(fā)送
SIGUSR1用戶自定義signal 1
SIGUSR2用戶自定義signal 2
SIGVTALRMsetitimer函數(shù)設(shè)置的Virtual Interval Timer超時的時候
SIGWAITINGSolaris Thread Library內(nèi)部實現(xiàn)專用
SIGWINCH當Terminal的窗口大小改變的時候,發(fā)送給Foreground Group的所有進程
SIGXCPU當CPU時間限制超時的時候
SIGXFSZ進程超過文件大小限制
SIGXRESSolaris專用,進程超過資源限制的時候發(fā)

總結(jié)

以上是生活随笔為你收集整理的linux下signal()函数超详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。