溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中signal函數(shù)怎么用

發(fā)布時(shí)間:2022-02-19 11:09:46 來(lái)源:億速云 閱讀:217 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Linux中signal函數(shù)怎么用,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Linux系統(tǒng)的信號(hào)機(jī)制最簡(jiǎn)單的接口是signal函數(shù)。signal函數(shù)的功能:為指定的信號(hào)安裝一個(gè)新的信號(hào)處理函數(shù)。

Linux中signal函數(shù)怎么用

1. 功能

設(shè)置某一信號(hào)的對(duì)應(yīng)動(dòng)作

2. 聲明

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

sighandler_t signal(int signum, sighandler_t handler);

3. 參數(shù)說(shuō)明

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

?

(1)SIG_IGN

這個(gè)符號(hào)表示忽略該信號(hào)。 例如:

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

   signal(SIGINT, SIG_IGN);

   while(1);

   return 0;

}

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

?

(2)SIG_DFL

這個(gè)符號(hào)表示恢復(fù)對(duì)信號(hào)的系統(tǒng)默認(rèn)處理。不寫此處理函數(shù)默認(rèn)也是執(zhí)行系統(tǒng)默認(rèn)操作。 例如

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

   signal(SIGINT, SIG_DFL);

   while(1);

   return 0;

}

這時(shí)就可以按下CTRL +C 來(lái)終止該進(jìn)程了。把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中為這個(gè)函數(shù)的名字。當(dāng)接收到一個(gè)類型為sig的信號(hào)時(shí),就執(zhí)行handler 所指定的函數(shù)。(int)signum是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進(jìn)程只要接收到類型為sig的信號(hào),不管其正在執(zhí)行程序的哪一部分,就立即執(zhí)行func()函數(shù)。當(dāng)func()函數(shù)執(zhí)行結(jié)束后,控制權(quán)返回進(jìn)程被中斷的那一點(diǎn)繼續(xù)執(zhí)行。 例如

#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;

}

執(zhí)行時(shí),當(dāng)我們按下CTRL +C鍵時(shí),會(huì)執(zhí)行我們定義的信號(hào)處理函數(shù)。

catch signal 2

catch signal 2

catch signal 2

catch signal 2

=退出

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

4. 函數(shù)說(shuō)明

signal()會(huì)依參數(shù)signum 指定的信號(hào)編號(hào)來(lái)設(shè)置該信號(hào)的處理函數(shù)。當(dāng)指定的信號(hào)到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。

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

5. 返回值

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

6. 一些常用的Signal :

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

關(guān)于“Linux中signal函數(shù)怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI