Linux程序間通訊 訊號

2021-08-19 13:59:41 字數 2966 閱讀 1286

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 什麼是訊號通訊,或者說什麼是訊號機制?訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式。通常如...