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