日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux信號signal函數(shù)

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

成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的漳平網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1. 功能

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

2. 聲明

#include  

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  

#include  

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é)束,當(dāng)我們按下CTRL +\組合鍵時,產(chǎn)生了SIGQUIT信號,此信號并沒有被忽略。

(2)SIG_DFL

這個符號表示恢復(fù)對信號的系統(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;

}

這時就可以按下CTRL +C 來終止該進(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中為這個函數(shù)的名字。當(dāng)接收到一個類型為sig的信號時,就執(zhí)行handler 所指定的函數(shù)。(int)signum是傳遞給它的唯一參數(shù)。執(zhí)行了signal()調(diào)用后,進(jìn)程只要接收到類型為sig的信號,不管其正在執(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í)行時,當(dāng)我們按下CTRL +C鍵時,會執(zhí)行我們定義的信號處理函數(shù)。

catch signal 2

catch signal 2

catch signal 2

catch signal 2

=退出

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

4. 函數(shù)說明

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

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

5. 返回值

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

6. 一些常用的Signal :

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

文章名稱:Linux信號signal函數(shù)
分享路徑:http://m.5511xx.com/article/dhcchso.html