信號(hào)的基本概念
每個(gè)信號(hào)都有一個(gè)編號(hào)和一個(gè)宏定義名稱 ,這些宏定義可以在 signal.h 中找到。
使用kill -l命令查看系統(tǒng)中定義的信號(hào)列表: 1-31是普通信號(hào); 34-64是實(shí)時(shí)信號(hào)

所有的信號(hào)都由操作系統(tǒng)來發(fā)!
對(duì)信號(hào)的三種處理方式
1、忽略此信號(hào):大多數(shù)信號(hào)都可使用這種方式進(jìn)行處理,但有兩種信號(hào)卻決不能被忽略。它們是:SIGKILL和SIGSTOP。這兩種信號(hào)不能被忽略的,原因是:它們向超級(jí)用戶提供一種使進(jìn)程終止或停止的可靠方法。另外,如果忽略某些由硬件異常產(chǎn)生的信號(hào)(例如非法存儲(chǔ)訪問或除以0),則進(jìn)程的行為是示定義的。
2、直接執(zhí)行進(jìn)程對(duì)于該信號(hào)的默認(rèn)動(dòng)作 :對(duì)大多數(shù)信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是終止該進(jìn)程。
3、捕捉信號(hào):執(zhí)行自定義動(dòng)作(使用signal函數(shù)),為了做到這一點(diǎn)要通知內(nèi)核在某種信號(hào)發(fā)生時(shí),調(diào)用一個(gè)用戶函數(shù)handler。在用戶函數(shù)中,可執(zhí)行用戶希望對(duì)這種事件進(jìn)行的處理。注意,不能捕捉SIGKILL和SIGSTOP信號(hào)。
#include <signal.h>typedef void( *sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);
signal函數(shù)的作用:給某一個(gè)進(jìn)程的某一個(gè)特定信號(hào)(標(biāo)號(hào)為signum)注冊(cè)一個(gè)相應(yīng)的處理函數(shù),即對(duì)該信號(hào)的默認(rèn)處理動(dòng)作進(jìn)行修改,修改為handler函數(shù)所指向的方式。
1、第一個(gè)參數(shù)是信號(hào)的標(biāo)號(hào)
2、第二個(gè)參數(shù),sighandler_t是一個(gè)typedef來的,原型是void (*)(int)函數(shù)指針,int的參數(shù)會(huì)被設(shè)置成signum
舉個(gè)代碼例子:
#include<stdio.h>#include<signal.h>void handler(int sig){ printf("get a sig,num is %d/n",sig);} int main(){ signal(2,handler); while(1) { sleep(1); printf("hello/n"); } return 0;} 修改了2號(hào)信號(hào)(Ctrl-c)的默認(rèn)處理動(dòng)作為handler函數(shù)的內(nèi)容,則當(dāng)該程序在前臺(tái)運(yùn)行時(shí),鍵入Ctrl-c后不會(huì)執(zhí)行它的默認(rèn)處理動(dòng)作(終止該進(jìn)程)

信號(hào)的處理過程:

進(jìn)程收到一個(gè)信號(hào)后不會(huì)被立即處理,而是在恰當(dāng) 時(shí)機(jī)進(jìn)行處理!什么是適當(dāng)?shù)臅r(shí)候呢?比如說中斷返回的時(shí)候,或者內(nèi)核態(tài)返回用戶態(tài)的時(shí)候(這個(gè)情況出現(xiàn)的比較多)。
信號(hào)不一定會(huì)被立即處理,操作系統(tǒng)不會(huì)為了處理一個(gè)信號(hào)而把當(dāng)前正在運(yùn)行的進(jìn)程掛起(切換進(jìn)程),掛起(進(jìn)程切換)的話消耗太大了,如果不是緊急信號(hào),是不會(huì)立即處理的。操作系統(tǒng)多選擇在內(nèi)核態(tài)切換回用戶態(tài)的時(shí)候處理信號(hào),這樣就利用兩者的切換來處理了(不用單獨(dú)進(jìn)行進(jìn)程切換以免浪費(fèi)時(shí)間)。
總歸是不能避免的,因?yàn)楹苡锌赡茉谒叩倪M(jìn)程就接收到信號(hào),操作系統(tǒng)肯定不愿意切換當(dāng)前正在運(yùn)行的進(jìn)程,于是就得把信號(hào)儲(chǔ)存在進(jìn)程唯一的PCB(task_struct)當(dāng)中。
產(chǎn)生信號(hào)的條件
1.用戶在終端按下某些鍵時(shí),終端驅(qū)動(dòng)程序會(huì)發(fā)送信號(hào)給前臺(tái)程序。
例如:Ctrl-c產(chǎn)生SIGINT信號(hào),Ctrl-/產(chǎn)生SIGQUIT信號(hào),Ctrl-z產(chǎn)生SIGTSTP信號(hào)
2.硬件異常產(chǎn)生信號(hào)。
這類信號(hào)由硬件檢測(cè)到并通知內(nèi)核,然后內(nèi)核向當(dāng)前進(jìn)程發(fā)送適當(dāng)?shù)男盘?hào)。
例如:當(dāng)前進(jìn)程執(zhí)行除以0的指令,CPU的運(yùn)算單元會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)進(jìn)程解釋為SIGFPE信號(hào)發(fā)送給當(dāng)前進(jìn)程。
當(dāng)前進(jìn)程訪問了非法內(nèi)存地址,MMU會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)異常解釋為SIGSEGV信號(hào)發(fā)送給進(jìn)程。
3.一個(gè)進(jìn)程調(diào)用kill(2)函數(shù)可以發(fā)送信號(hào)給另一個(gè)進(jìn)程。
可以用kill(1)命令發(fā)送信號(hào)給某個(gè)進(jìn)程,kill(1)命令也是調(diào)用kill(2)函數(shù)實(shí)現(xiàn)的,如果不明確指定信號(hào)則發(fā)送SIGTERM信號(hào),該信號(hào)的默認(rèn)處理動(dòng)作是終止進(jìn)程。
信號(hào)的產(chǎn)生
1.通過終端按鍵產(chǎn)生信號(hào)
舉個(gè)栗子:寫一個(gè)死循環(huán),前臺(tái)運(yùn)行這個(gè)程序,然后在終端鍵入Ctrl-c

當(dāng)CPU正在執(zhí)行這個(gè)進(jìn)程的代碼 , 終端驅(qū)動(dòng)程序發(fā)送了一 個(gè) SIGINT 信號(hào)給該進(jìn)程,記錄在該進(jìn)程的 PCB中,則該進(jìn)程的用戶空間代碼暫停執(zhí)行 ,CPU從用戶態(tài) 切換到內(nèi)核態(tài)處理硬件中斷。
從內(nèi)核態(tài)回到用戶態(tài)之前, 會(huì)先處理 PCB中記錄的信號(hào) ,發(fā)現(xiàn)有一個(gè) SIGINT 信號(hào)待處理, 而這個(gè)信號(hào)的默認(rèn)處理動(dòng)作是終止進(jìn)程,所以直接終止進(jìn)程而不再返回它的用戶空間代碼執(zhí)行。
2.調(diào)用系統(tǒng)函數(shù)向進(jìn)程發(fā)信號(hào)
/************************************************************************* > File Name: test.c > Author:Lynn-Zhang > Mail: iynu17@yeah.net > Created Time: Fri 15 Jul 2016 03:03:57 PM CST ************************************************************************/ #include<stdio.h>int main(){ printf("get pid :%d circle .../n",getpid()); while(1); return 0;}寫一個(gè)上面的程序在后臺(tái)執(zhí)行死循環(huán),并獲取該進(jìn)程的id,然后用kill命令給它發(fā)送SIGSEGV信號(hào),可以使進(jìn)程終止。也可以使用kill -11 5796,11是信號(hào)SIGSEGV的編號(hào)。
打開終端1,運(yùn)行程序:

利用終端2,給進(jìn)程發(fā)送信號(hào)

終端1 顯示進(jìn)程被core了:

kill命令是調(diào)用kill函數(shù)實(shí)現(xiàn)的。kill函數(shù)可以給一個(gè)指定的進(jìn)程發(fā)送指定信號(hào)。
raise函數(shù)可 以給當(dāng)前進(jìn)程發(fā)送指定的信號(hào) (自己給自己發(fā)信號(hào) )
#include<signal.h>int kill(pid_t pid,int signo);int raise(int signo);
這兩個(gè)函數(shù)都是成功返回0,錯(cuò)誤返回-1.
除此之外,abort函數(shù)使當(dāng)前進(jìn)程接收到SIGABRT信號(hào)而異常終止。
#include<stdlib.h>void abort(void);
就像 exit函數(shù)一樣 ,abort 函數(shù)總是會(huì)成功的 ,所以沒有返回值。
3.由軟件條件產(chǎn)生信號(hào)
/************************************************************************* > File Name: alarm.c > Author:Lynn-Zhang > Mail: iynu17@yeah.net > Created Time: Fri 15 Jul 2016 08:52:02 PM CST ************************************************************************/ #include<stdio.h> int main(){ int count=0; alarm(1); while(1) { printf("%d/n",count); count++; } return 0;} 通過實(shí)現(xiàn)以上代碼,調(diào)用alarm函數(shù)可以設(shè)定一個(gè)鬧鐘,告訴內(nèi)核在seconds秒之后給當(dāng)前進(jìn)程發(fā)SIGALRM信號(hào), 該信號(hào)的默認(rèn)處理動(dòng)作是終止當(dāng)前進(jìn)程。
該程序會(huì)在1秒鐘之內(nèi)不停地?cái)?shù)數(shù),并打印計(jì)數(shù)器,1秒鐘到了就被SIGALRM信號(hào)終止。由于電腦配置等的不同,每臺(tái)電腦一秒鐘之內(nèi)計(jì)數(shù)值是不同的一般是不同的。
#include <unistd.h>unsigned int alarm(unsigned int seconds);
alarm函數(shù)的返回值是0或上次設(shè)置鬧鐘剩余的時(shí)間。

阻塞信號(hào)
1.信號(hào)在內(nèi)核中的表示:
信號(hào)遞達(dá)delivery:實(shí)際執(zhí)行信號(hào)處理信號(hào)的動(dòng)作
信號(hào)未決pending:信號(hào)從產(chǎn)生到抵達(dá)之間的狀態(tài),信號(hào)產(chǎn)生了但是未處理
忽略:抵達(dá)之后的一種 動(dòng)作
阻塞block:收到信號(hào)不立即處理 被阻塞的信號(hào)將保持未決狀態(tài),直到進(jìn)程解除對(duì)此信號(hào)的阻塞,才執(zhí)行抵達(dá)動(dòng)作
信號(hào)產(chǎn)生和阻塞沒有直接關(guān)系 抵達(dá)和解除阻塞沒有直接關(guān)系!
進(jìn)程收到一個(gè)信號(hào)后,不會(huì)立即處理,它會(huì)在恰當(dāng)?shù)臅r(shí)機(jī)被處理。

每個(gè)信號(hào)都由兩個(gè)標(biāo)志位分別表示阻塞和未決,以及一個(gè)函數(shù)指針表示信號(hào)的處理動(dòng)作。
在上圖的例子中,
1. SIGHUP信號(hào)未阻塞也未產(chǎn)生過,當(dāng)它遞達(dá)時(shí)執(zhí)行默認(rèn)處理動(dòng)作。
2. SIGINT信號(hào)產(chǎn)生過,但正在被阻塞,所以暫時(shí)不能遞達(dá)。雖然它的處理動(dòng)作是忽略,但在沒 有解除阻塞之前不能忽略這個(gè)信號(hào),因?yàn)檫M(jìn)程仍有機(jī)會(huì)改變處理動(dòng)作之后再解除阻塞。
3. SIGQUIT信號(hào)未產(chǎn)生過,一旦產(chǎn)生SIGQUIT信號(hào)將被阻塞,它的處理動(dòng)作是用戶自定義函數(shù)sighandler。阻塞信號(hào)集也叫作信號(hào)屏蔽字。
信號(hào)產(chǎn)生但是不立即處理,前提條件是要把它保存在pending表中,表明信號(hào)已經(jīng)產(chǎn)生。
2.信號(hào)集操作函數(shù)
#include <signal.h>int sigemptyset(sigset_t *set); //初始化set所指向的信號(hào)集,使所有信號(hào)的對(duì)應(yīng)位清0int sigfillset(sigset_t *set); //初始化set所指向的信號(hào)集,表示該信號(hào)集的有效信號(hào)包括系統(tǒng)支持的所有信號(hào)int sigaddset(sigset_t *set, int signo); //在該信號(hào)集中添加有效信號(hào)int sigdelset(sigset_t *set, int signo); //在該信號(hào)集中刪除有效信號(hào)int sigismember(const sigset_t *set, int signo); //用于判斷一個(gè)信號(hào)集的有效信號(hào)中是否包含某種信號(hào)
參數(shù)解析:
sigset_t結(jié)構(gòu)體的參數(shù)表示信號(hào)集,信號(hào)操作的時(shí)候都是以信號(hào)集合的方式進(jìn)行操作,需要事先創(chuàng)建一個(gè)該結(jié)構(gòu)體的對(duì)象,然后把想要操作的信號(hào)添加到信號(hào)集合對(duì)象當(dāng)中去
signo就是信號(hào)的標(biāo)號(hào)了
3.調(diào)用函數(shù)sigprocmask可以讀取或更改進(jìn)程的信號(hào)屏蔽字(阻塞信號(hào)集)。
#include <signal.h>int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
一個(gè)進(jìn)程的信號(hào)屏蔽字規(guī)定了當(dāng)前阻塞而不能遞送給該進(jìn)程的信號(hào)集。調(diào)用函數(shù)sigprocmask可以檢測(cè)或更改(或兩者)進(jìn)程的信號(hào)屏蔽字。如果調(diào)用sigprocmask解除了對(duì)當(dāng)前若干個(gè)未決信號(hào)的阻塞,則在sigprocmask返回前,至少將其中 一個(gè)信號(hào)遞達(dá)。
參數(shù)解析:
how,有三個(gè)宏
SIG_BLOCK 添加到block表當(dāng)中去
SIG_UNBLOCK 從block表中刪除
SIG_SETMASK 設(shè)置block表 設(shè)置當(dāng)前信號(hào)屏蔽字為set所指向的值
set表示新設(shè)置的信號(hào)屏蔽字,oset表示當(dāng)前信號(hào)屏蔽字
處理方式:
set 非空, oset 為NULL :按照how指示的方法更改set指向信號(hào)集的信號(hào)屏蔽字。
set 為NULL,oset 非空:讀取oset指向信號(hào)集的信號(hào)屏蔽字,通過oset參數(shù)傳出。
set 和 oset 都非空 :現(xiàn)將原來的信號(hào)屏蔽字備份到oset里,然后根據(jù)set和how參數(shù)更改信號(hào)屏蔽字。
4. sigpending讀取當(dāng)前進(jìn)程的未決信號(hào)集,通過set參數(shù)傳出
#include <signal.h>int sigpending(sigset_t *set);
這是一個(gè)輸出型參數(shù),會(huì)把當(dāng)前進(jìn)程的pending表打印到傳入的set集中。
實(shí)例驗(yàn)證上面幾個(gè)函數(shù):


一開始沒有任何信號(hào),所以pending表中全是0,我通過Ctrl+C傳入2號(hào)信號(hào),看到pending表中有2號(hào)被置位了,經(jīng)過10秒取消阻塞,2號(hào)信號(hào)被處理(經(jīng)過我自定義的函數(shù))

Linux下捕捉信號(hào)
信號(hào)由三種處理方式:
忽略
執(zhí)行該信號(hào)的默認(rèn)處理動(dòng)作
捕捉信號(hào)
如果信號(hào)的處理動(dòng)作是用戶自定義函數(shù),在信號(hào)遞達(dá)時(shí)就調(diào)用這個(gè)自定義函數(shù),這稱為捕捉信號(hào)。
進(jìn)程收到一個(gè)信號(hào)后不會(huì)被立即處理,而是在恰當(dāng)時(shí)機(jī)進(jìn)行處理!即內(nèi)核態(tài)返回用戶態(tài)之前 !
但是由于信號(hào)處理函數(shù)的代碼在用戶空間,所以這增加了內(nèi)核處理信號(hào)捕捉的復(fù)雜度。
內(nèi)核實(shí)現(xiàn)信號(hào)捕捉的步驟:
1、用戶為某信號(hào)注冊(cè)一個(gè)信號(hào)處理函數(shù)sighandler。
2、當(dāng)前正在執(zhí)行主程序,這時(shí)候因?yàn)橹袛唷惓;蛳到y(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)。
3、在處理完異常要返回用戶態(tài)的主程序之前,檢查到有信號(hào)未處理,并發(fā)現(xiàn)該信號(hào)需要按照用戶自定義的函數(shù)來處理。
4、內(nèi)核決定返回用戶態(tài)執(zhí)行sighandler函數(shù),而不是恢復(fù)main函數(shù)的上下文繼續(xù)執(zhí)行!(sighandler和main函數(shù)使用的是不同的堆棧空間,它們之間不存在調(diào)用和被調(diào)用的關(guān)系,是兩個(gè)獨(dú)立的控制流程)
5、sighandler函數(shù)返回后,執(zhí)行特殊的系統(tǒng)調(diào)用sigreturn從用戶態(tài)回到內(nèi)核態(tài)
6、檢查是否還有其它信號(hào)需要遞達(dá),如果沒有 則返回用戶態(tài)并恢復(fù)主程序的上下文信息繼續(xù)執(zhí)行。
signal
給某一個(gè)進(jìn)程的某一個(gè)信號(hào)(標(biāo)號(hào)為signum)注冊(cè)一個(gè)相應(yīng)的處理函數(shù),即對(duì)該信號(hào)的默認(rèn)處理動(dòng)作進(jìn)行修改,修改為handler函數(shù)指向的方式;
#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);<br>//即:<br>void (*signal(int, void(*)(int)))(int);
signal函數(shù)接受兩個(gè)參數(shù):一個(gè)整型的信號(hào)編號(hào),以及一個(gè)指向用戶定義的信號(hào)處理函數(shù)的指針。
此外,signal函數(shù)的返回值是一個(gè)指向調(diào)用用戶定義信號(hào)處理函數(shù)的指針。
sigaction
sigaction函數(shù)可以讀取和修改與指定信號(hào)相關(guān)聯(lián)的處理動(dòng)作。
#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction{ void (*sa_handler)(int); //信號(hào)處理方式 void (*sa_sigaction)(int, siginfo_t *, void *); //實(shí)時(shí)信號(hào)的處理方式 暫不討論 sigset_t sa_mask; //額外屏蔽的信號(hào) int sa_flags; void (*sa_restorer)(void); };signum是指定信號(hào)的編號(hào)。
處理方式:
1、若act指針非空,則根據(jù)act結(jié)構(gòu)體中的信號(hào)處理函數(shù)來修改該信號(hào)的處理動(dòng)作。
2、若oact指針非 空,則通過oact傳出該信號(hào)原來的處理動(dòng)作。
3、現(xiàn)將原來的處理動(dòng)作備份到oact里,然后根據(jù)act修改該信號(hào)的處理動(dòng)作。
(注:后兩個(gè)參數(shù)都是輸入輸出型參數(shù)!)
將sa_handler三種可選方式:
1、賦值為常數(shù)SIG_IGN傳給sigaction表示忽略信號(hào);
2、賦值為常數(shù)SIG_DFL表示執(zhí)行系統(tǒng)默認(rèn)動(dòng)作;
3、賦值為一個(gè)函數(shù)指針表示用自定義函數(shù)捕捉信號(hào),或者說向內(nèi)核注冊(cè)一個(gè)信號(hào)處理函 數(shù),該函數(shù)返回值為void,可以帶一個(gè)int參數(shù),通過參數(shù)可以得知當(dāng)前信號(hào)的編號(hào),這樣就可以用同一個(gè)函數(shù)處理多種信號(hào)。
(注:這是一個(gè)回調(diào)函數(shù),不是被main函數(shù)調(diào)用,而是被系統(tǒng)所調(diào)用)
當(dāng)某個(gè)信號(hào)的處理函數(shù)被調(diào)用時(shí),內(nèi)核自動(dòng)將當(dāng)前信號(hào)加入進(jìn)程的信號(hào)屏蔽字,當(dāng)信號(hào)處理函數(shù)返回時(shí)自動(dòng)恢復(fù)原來的信號(hào)屏蔽字,這樣就保證了在處理某個(gè)信號(hào)時(shí),如果這種信號(hào)再次產(chǎn)生,那么 它會(huì)被阻塞到當(dāng)前處理結(jié)束為止。
pause
pause函數(shù)使調(diào)用進(jìn)程掛起直到有信號(hào)遞達(dá)!
#include <unistd.h>int pause(void);
處理方式:
如果信號(hào)的處理動(dòng)作是終止進(jìn)程,則進(jìn)程終止,pause函數(shù)沒有機(jī)會(huì)返回;
如果信號(hào)的處理動(dòng)作是忽略,則進(jìn)程繼續(xù)處于掛起狀態(tài),pause不返回;
如果信號(hào)的處理動(dòng)作是捕捉,則調(diào)用了信號(hào)處理函數(shù)之后pause返回-1,errno設(shè)置為EINTR。
所以pause只有出錯(cuò)的返回值(類似exec函數(shù)家族)。錯(cuò)誤碼EINTR表示“被信號(hào)中斷”。
舉個(gè)栗子
1、定義一個(gè)鬧鐘,約定times秒后,內(nèi)核向該進(jìn)程發(fā)送一個(gè)SIGALRM信號(hào);
2、調(diào)用pause函數(shù)將進(jìn)程掛起,內(nèi)核切換到別的進(jìn)程運(yùn)行;
3、times秒后,內(nèi)核向該進(jìn)程發(fā)送SIGALRM信號(hào),發(fā)現(xiàn)其處理動(dòng)作是一個(gè)自定義函數(shù),于是切回用戶態(tài)執(zhí)行該自定義處理函數(shù);
4、進(jìn)入sig_alrm函數(shù)時(shí)SIGALRM信號(hào)被自動(dòng)屏蔽,從sig_alrm函數(shù)返回時(shí)SIGALRM信號(hào)自動(dòng)解除屏蔽。然后自動(dòng)執(zhí)行特殊的系統(tǒng)調(diào)用sigreturn再次進(jìn)入內(nèi)核,之后再返回用戶態(tài)繼續(xù)執(zhí)行進(jìn)程的主控制流程(main函數(shù)調(diào)用的mytest函數(shù))。
5、pause函數(shù)返回-1,然后調(diào)用alarm(0)取消鬧鐘,調(diào)用sigaction恢復(fù)SIGALRM信號(hào)以前的處理 動(dòng)作。
/************************************************************************* > File Name: Pause.c > Author:Lynn-Zhang > Mail: iynu17@yeah.net > Created Time: Sun 14 Aug 2016 12:27:03 PM CST ************************************************************************/ #include<stdio.h>#include<signal.h>#include<unistd.h>void sig_alarm(int signum){ printf("I am a custom handler!/n");}void mysleep(unsigned int times){ //注冊(cè)兩個(gè)信號(hào)處理動(dòng)作 struct sigaction new,old; new.sa_handler=sig_alarm; //信號(hào)處理函數(shù) sigemptyset(&new.sa_mask);//不屏蔽任何信號(hào)屏蔽字 new.sa_flags=0; //對(duì)SIGALRM 信號(hào)的默認(rèn)處理動(dòng)作修改為自定義處理動(dòng)作 sigaction(SIGALRM,&new,&old); alarm(times); pause(); //掛起等待 alarm(1); sleep(2); alarm(0); //取消鬧鐘 //恢復(fù)SIGALRM 信號(hào)到默認(rèn)處理動(dòng)作 sigaction(SIGALRM,&old,NULL); alarm(1); sleep(2);}int main(){ while(1) { mysleep(2); printf("many seconds passed/n"); printf("###################/n"); } return 0;} 
定義一個(gè)鬧鐘并掛起等待,收到信號(hào)后執(zhí)行自定義處理動(dòng)作,在沒有恢復(fù)默認(rèn)處理動(dòng)作前,收到SIGALRM信號(hào)都會(huì)按照其自定義處理函數(shù)來處理。恢復(fù)自定義處理動(dòng)作之后收到SIGALRM信號(hào)則執(zhí)行其默認(rèn)處理動(dòng)作即終止進(jìn)程!
總結(jié)
以上就是關(guān)于Linux下信號(hào)與捕捉信號(hào)的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)Linux信號(hào)能有所幫助,如果有疑問歡迎留言討論。
新聞熱點(diǎn)
疑難解答
圖片精選