linux通過訊號程序間通訊例項理解

2021-07-09 10:11:24 字數 1610 閱讀 1904

在linux系統程式設計的學習中,通過訊號進行程序簡編譯是一大重點

本文通過乙個例項加強對sigemptyset、sigprocmask的理解

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

其中 signum 為收到的訊號

其中

struct sigaction

void (*sa_sigaction)(int, siginfo_t *, void *);// } 兩個函式指標僅有乙個有效

sigset_t sa_mask; //阻塞訊號集

int sa_flags; //若sa_flags==0則*sa_handler;有效,若sa_flags==sa_siginfo則*sa_sigaction有效

void (*sa_restorer)(void);//擴充套件

}

其中sigset_t 為乙個結構體,訊號在int __val[32] 中以掩碼儲存,有32位二進位制數,以對應一位標『1』來儲存對應訊號
我們也可以通過

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);//  在程序阻塞訊號集裡,增加或刪除訊號
其中int how 有如下三種引數,均針對oldset

sig_block //增加

sig_unblock //刪除

sig_setmask //先清空程序阻塞集號,再增加

值得一提的是訊號在訊號集中的儲存並非簡單賦值,而是以掩碼的形式儲存,2進製數不同位標『1』表示不同命令的儲存。在此並不詳談。

當程序訊號集中存在某一訊號sig***時,向該程序傳送此訊號則會被阻塞,直至sa_flags對應的函式被執行完成為止。

以下為例項方便理解:

例項一:

#include 

#include

#include

#include

pid_t i,j;

void f(int sig)

if(kill(j,sigint)<0)

wait(i,null,0);

wait(j,null,0);

printf("parent process exit!\n");

exit(0);

}void f_1(int sig)

void f_2(int sig)

int main()

else

if(i==0)

else

if(i>0)

if(j==0)

if(j>0)

}}

例項二:

#include

#include

#include

int output(sigset_t set)

void handler(int sig)

int main()

Linux 程序間通訊 訊號

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...

Linux程序間通訊 訊號

1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...

Linux程序間通訊 訊號

訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...