歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux系統:Linux的信號機制

Linux系統:Linux的信號機制

日期:2017/2/25 10:36:34   编辑:Linux教程
信號是unix中所使用的進程通信的一種最古老的方法.系統使用它來同志一個或多個進程異步事件的發生.

linux系統庫bits/signum.h對信號名作了定義:
linux的大多數信號是提供給內核的,僅有少數幾種信號可以在信號間發送.

.SIGHUP 當終止一個終端時,內核就把這種信號發送給該終端所控制的所有進程.
.SIGINT 當一個用戶按下中斷鍵(ctrl+c)後,內核就向該終端用關聯的所有進程發送這個信號.
.SIGQUIT 當用戶按下(ctrl+),內核就向該終端用關聯的所有進程發送這個信號.
.SIGILL 當一個進程企圖執行一條非法指令時,內核就發送這個信號.
.SIGFPE 當產生浮點錯誤時,內核就發送這個信號.
.SIGKILL 這是一個非常特殊的信號,他可以從一個進程發送到另一個進程,使接收到該信號的進程終止.內核偶然也發送這種信號.
.SIGALRM 當一個定時器到時的時候,內核就發送這個信號.
.SIGSTOP 子進程結束信號.UNIX用它來實現系統調用exit(),wait();
信號的處理
unix的系統調用signal()用於接受一個指定的信號,並可以指定相應的處理方法.

在linux系統庫signal.h中,它的說明如下:
signal(int sig,sighandler_t handler);
sig用於指定信號類型.handle是用於處理該信號的函數.
handle還可以是:
.SIG_IGN 忽略這個信號.
.SIG_DFL 恢復對這個信號的默認處理.

例如:
#include
#include
#include

main(){
signal(SIGINT,SIG_IGN);
printf("hello!n");
sleep(10);
printf("hellon");
}
上面的代碼忽略了SININT信號.



又例如:
#include
#include
#include

int catch(int sig);

main(){
signal(SIGINT,catch);
printf("hello!n");
sleep(10);
printf("hello!n");
}

int catch(int sig){
printf("catch signaln");
return 1;
}
當用戶按下ctrl+c時,進程被中斷,catch()被執行.中斷處理函數處理完畢後,轉回斷點執行下面的指令.

當編寫自己的中斷處理函數時,注意下面兩點:
1.信號不能打斷系統調用.
2.信號不能打斷信號處理函數.
Copyright © Linux教程網 All Rights Reserved