通過訊號可以終止程序,也可以通過訊號在程序間通訊,程式也可以通過制定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理的訊號等問題呢?訊號集函式就是幫助我們解決這些問題的。
下面是訊號函式集:
1、int sigemptyset(sigset* set);
該函式的作用是將訊號集初始化為空。
2、int sigfillset(sigset* set);
該函式是把訊號集初始化包含所有已定義的訊號。
3、int sigaddset(sigset* set,int signo);
該函式是把訊號signo新增到訊號集set中,成功返回0,失敗返回-1
4、int sigdelset(sigset_t* set,int signo);
該函式的作用是把訊號signo從訊號集中刪除,成功時返回0,失敗時返回-1
5、int sigismember(sigset* set,int signo);
該函式判斷給定訊號signo是否是訊號集中的乙個成員,如果是返回1,如果不是,返回0,如果給定訊號無效,返回-1;
6、int sigpromask(int how,const sigset_t* set,sigset_t* oset);
該函式可根據引數指定的方法修改程序的訊號遮蔽字。新的訊號遮蔽字由引數set(非空)指定,而原先的訊號遮蔽字將儲存在oset(非空)中。如果set為空,則how沒有意義,但此時呼叫該函式,若oset不為空,則把當前訊號遮蔽字儲存到oset中。
how不同取值及操作如下:
sig_block:把引數set中的訊號新增到訊號遮蔽字中
sig_setmask:把訊號遮蔽字設定為引數set中的訊號
sig_unblock:從訊號遮蔽字中刪除引數set中的訊號
若sigpromask成功完成返回0,若how取值無效返回-1,並設定errno為einval。
注意:呼叫這個函式才能改變程序的遮蔽字,之前的函式都是為改變乙個變數的值而已,並不會真正影響程序的遮蔽字。
7、int sigpending(sigset* set);
該函式將被阻塞的訊號中停留在待處理狀態的一組訊號寫到引數set指向的訊號集中,成功返回0,否則返回-1,並設定errno表明錯誤原因。
8、int sigsuspend(const sigset_t* sigmask);
該函式通過將程序的遮蔽字替換為由引數sigmask給出的訊號集,然後掛起程序的執行。注意操作的先後順序,是先替換再掛起程式的執行。程式將在訊號處理函式執行完畢後繼續執行。若接收到訊號終止了程式,sigsuspend就不會返回,如果接收到的訊號沒有終止程式,sigsuspend就返回-1,並將errno設定為eintr。
#include
#include
#include
#include
#include
void handler(int sig)
首先,我們能通過sigaction函式改變sigint訊號的預設行為,使之執行指定的函式handler,列印出handle the signal。然後通過sigprocmask設定程序的訊號遮蔽字,把sigint訊號遮蔽起來,延時10s之後,用sigpending函式去獲取被阻塞的訊號集時,檢測到了被阻塞的訊號sigint,輸出the sigint signal has ignored。最後,呼叫函式sigdelset去除先前用sigaddset函式加在sigset上的訊號sigint,再呼叫函式sigsuspend,把程序遮蔽字再次修改為sigset(不包含sigint)並掛起程序。由於先前的sigint訊號停留在待處理狀態,而現在程序已經不再阻塞該訊號,所以程序馬上對該訊號進行處理,從而在最後,你不用輸入ctrl+c也會出現後面的處理語句,最後過了5s程式就成功推出了。
Linux程序間通訊 訊號集函式
分類 初學linux 2013 08 21 02 32 1298人閱讀收藏 舉報linux 程序間通訊 訊號訊號集函式 我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那...
Linux程序間通訊 訊號集函式
我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理哪些訊號等問題呢?訊號集函式就是幫助我們解決這些問題的。linux程...
Linux程序間通訊 訊號集函式
linux 程序間通訊 訊號訊號集函式 我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理哪些訊號等問題呢?訊號集函式...