信號是在軟件層次上對中斷的一種模擬,所以通常把它稱為是軟中斷
信號和中斷的區(qū)別
信號與中斷的相似點(diǎn):
(1)采用了相同的異步通信方式;
(2)當(dāng)檢測出有信號或中斷請求時,都暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序;
(3)都在處理完畢后返回到原來的斷點(diǎn);
(4)對信號或中斷都可進(jìn)行屏蔽。
信號與中斷的區(qū)別:
(1)中斷有優(yōu)先級,而信號沒有優(yōu)先級,所有的信號都是平等的;
(2)信號處理程序是在用戶態(tài)下運(yùn)行的,而中斷處理程序是在核心態(tài)下運(yùn)行;
(3)中斷響應(yīng)是及時的,而信號響應(yīng)通常都有較大的時間延遲。
SIGABRT 進(jìn)程停止運(yùn)行 6
SIGINT 終端中斷 2
SIGKILL 停止進(jìn)程(此信號不能被忽略或捕獲)
SIGQUIT 終端退出 3
handler這個函數(shù)必須有一個int類型的參數(shù)(即接收到的信號代碼),它本身的類型是void,
handler也可以是下面兩個特殊值:
SIG_IGN 屏蔽該信號
SIG_DFL 恢復(fù)默認(rèn)行為/*
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
*/
signal的函數(shù)原型,這里要注意它的返回值的類型,
它的參數(shù),第一個是信號的編號,也就是具體是哪一個信號,固定的寫法,沒什么好說的,
第二個參數(shù)handler,
1, 賦值SIG_IGN代表忽略信號,
2,或者你可以自己寫個信號處理函數(shù),傳給它地址,
3,如果你需要修改上面的設(shè)置,可以恢復(fù)默認(rèn)SIG_DFL ,
下面是一個自己寫的信號處理函數(shù),
說兩點(diǎn),
1,默認(rèn)自帶一個int類型參數(shù),//開始還在找,這個num哪里傳進(jìn)去的,
2,返回類型是void,
- void handler(int num)
- {
- printf("recv num:%d \n", num);
- if (num == SIGQUIT)
- {
- //exit(0);
- }
- }
下面是signal返回值的應(yīng)用場景,
- if (signal(SIGINT, handler) == SIG_ERR)
- {
- perror("signal err"); //errno
- exit(0);
- }
這是它的返回 typedef void (*sighandler_t)(int);