1.什麼是訊號
訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。
2.訊號的產生
1)由硬體產生,如從鍵盤輸入ctrl+c可以終止當前程序
2)由其他程序傳送,如可在shell程序下,使用命令 kill -訊號標號 pid,向指定程序傳送訊號。
3)異常,程序異常時會傳送訊號
3.訊號的處理
訊號是由作業系統來處理的,說明訊號的處理在核心態。
訊號不一定會立即被處理,此時會儲存在訊號的訊號表中。
處理過程示意圖:
由上圖中可看出訊號有三種處理方式:
1)忽略
2)預設處理方式:作業系統設定的預設處理方式
3)自定義訊號處理方式:可自定義訊號處理函式
4.自定義訊號處理方式
1)signal函式
原型:void (*signal(int sig, void (*func)(int)))(int);
sig:訊號值
func:訊號處理函式指標,引數為訊號值
**示例如下:
#include #include輸出結果:void ouch(int
sig)
intmain()
return0;
}
2)sigaction函式
原型:int sigaction(int sig,const struct sigaction *act,struct sigaction *oact);
sig:訊號值
act:指定訊號的動作
oact:儲存原訊號的動作
sigaction結構體的定義如下:
void (*)(int) sa_handler;處理函式指標,相當於signal函式的func引數。
sigset_t sa_mask;處理過程中,遮蔽對sa_mask訊號集的處理,sa_mask可以消除訊號間的競態。
int sa_flags;訊號處理修改器:處理函式執行完後,訊號處理方式修改。如sa_resethand,將訊號處理方式重置為sig_dfl
**示例如下:
#include #include輸出結果:void ouch(int
sig)
intmain()
return0;
}
4.訊號的傳送
1)kill函式
int kill(pid_t pid,int signo);
pid:程序id
signo:訊號值
2)raise函式:只能向當前程序發訊號
int raise(int signo);
signo:訊號值
3)abort函式:傳送sigabrt訊號,可以讓程序異常終止
void abort(void);
4)alarm函式:傳送sigalrm鬧鐘訊號
unsigned int alarm(unsigned int seconds);
5.訊號的阻塞
阻塞是阻止程序收到該訊號,此時訊號處於未決狀態,放入程序的未決訊號表中,
當解除對該訊號的阻塞時,未決訊號會被程序接收。
1)阻塞訊號
原型:int sigprocmask(int how,const sigset_t *set,sigset_t *oset);
how:設定block阻塞表的方式
a.sig_block:將訊號集新增到block表中
b.sig_unblock:將訊號集從block表中刪除
c.sig_setmask:將訊號集設定為block表
set:要設定的集合
oset:設定前儲存之前block表資訊
2)獲取未決訊號
前面已經講過,阻塞的訊號處於未決的狀態,會放入程序的未決訊號表。
原型:int sigpending(sigset_t *set);
set:out型引數,會將獲得的當前程序的pending未決表中的訊號集傳入。
**示例如下:
#include #include輸出結果:#include
#include
void func(int
num)
void printfpendingsignal(sigset_t *set
)
else
} printf("\n
");}int
main()
} return0;
}
6.訊號處理函式的安全問題
如果訊號處理過程中被中斷,再次呼叫,然後返回到第一次呼叫時,要保證操作的正確性。
這就要求訊號處理函式必須是可重入的。
可重入函式表如下:
7.一些常見的訊號
如果程序接收到上面的這些訊號,又沒有安排捕獲它,程序就會終止。
其他的一些訊號如下:
Linux 程序間通訊 訊號
訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...
Linux程序間通訊 訊號
訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...
linux程序間通訊 七 訊號通訊
在之前的博文 linux程序間通訊 一 初識篇 中,我們知道了程序間通訊主要分為三大類,分別是管道通訊,訊號通訊,以及ipc通訊 程序間通訊主要是為了不同程序之間的資料共享,訊號通訊也不例外。1 什麼是訊號通訊,或者說什麼是訊號機制?訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。通常如...