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