Linux程序間通訊 訊號集函式

2021-07-30 10:42:35 字數 2260 閱讀 3144

我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理哪些訊號等問題呢?訊號集函式就是幫助我們解決這些問題的。

linux程序間通訊——使用訊號

下面是訊號函式集:

1、int sigemptyset(sigset_t *set);

該函式的作用是將訊號集初始化為空。

2、int sigfillset(sigset_t *set);

該函式的作用是把訊號集初始化包含所有已定義的訊號。

3、int sigaddset(sigset_t *set, int signo);

該函式的作用是把訊號signo新增到訊號集set中,成功時返回0,失敗時返回-1。

4、int sigdelset(sigset_t *set, int signo);

該函式的作用是把訊號signo從訊號集set中刪除,成功時返回0,失敗時返回-1.

5、int sigismember(sigset_t *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的不同取值及操作如下所示:

如果sigpromask成功完成返回0,如果how取值無效返回-1,並設定errno為einval。

注意:呼叫這個函式才能改變程序的遮蔽字,之前的函式都是為改變乙個變數的值而已,並不會真正影響程序的遮蔽字。

7、int sigpending(sigset_t *set);

該函式的作用是將被阻塞的訊號中停留在待處理狀態的一組訊號寫到引數set指向的訊號集中,成功呼叫返回0,否則返回-1,並設定errno表明錯誤原因。

8、int sigsuspend(const sigset_t *sigmask);

該函式通過將程序的遮蔽字替換為由引數sigmask給出的訊號集,然後掛起程序的執行。注意操作的先後順序,是先替換再掛起程式的執行。程式將在訊號處理函式執行完畢後繼續執行。如果接收到訊號終止了程式,sigsuspend就不會返回,如果接收到的訊號沒有終止程式,sigsuspend就返回-1,並將errno設定為eintr。

特別提醒:如果乙個訊號被程序阻塞,它就不會傳遞給程序,但會停留在待處理狀態,當程序解除對待處理訊號的阻塞時,待處理訊號就會立刻被處理。

下面以乙個例子來說明上述函式的用法,原始檔為sigset.c,**如下:

[cpp]view plain

copy

print?

#include 

#include 

#include 

#include 

#include 

void

handler(

intsig)  

intmain()    

執行結果如下:

首先,我們能過sigaction函式改變了sigint訊號的預設行為,使之執行指定的函式handler,所以輸出了語句:handle the signal 2。然後,通過sigprocmask設定程序的訊號遮蔽字,把sigint訊號遮蔽起來,所以過了10秒之後,用sigpending函式去獲取被阻塞的訊號集時,檢測到了被阻塞的訊號sigint,輸出the sigint signal has ignored。最後,用函式sigdelset函式去除先前用sigaddset函式加在sigset上的訊號sigint,再呼叫函式sigsuspend,把程序的遮蔽字再次修改為sigset(不包含sigint),並掛起程序。由於先前的sigint訊號停留在待處理狀態,而現在程序已經不再阻塞該訊號,所以程序馬上對該訊號進行處理,從而在最後,你不用輸入ctrl+c也會出現後面的處理語句(可參閱前面特別提醒的內容),最後過了5秒程式就成功退出了。

Linux程序間通訊 訊號集函式

分類 初學linux 2013 08 21 02 32 1298人閱讀收藏 舉報linux 程序間通訊 訊號訊號集函式 我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那...

Linux程序間通訊 訊號集函式

我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理哪些訊號等問題呢?訊號集函式就是幫助我們解決這些問題的。linux程...

Linux程序間通訊 訊號集函式

linux 程序間通訊 訊號訊號集函式 我們已經知道,我們可以通過訊號來終止程序,也可以通過訊號來在程序間進行通訊,程式也可以通過指定訊號的關聯處理函式來改變訊號的預設處理方式,也可以遮蔽某些訊號,使其不能傳遞給程序。那麼我們應該如何設定我們需要處理的訊號,我們不需要處理哪些訊號等問題呢?訊號集函式...