Linux信号 五 信号挂起与信号掩码操作接口集
生活随笔
收集整理的這篇文章主要介紹了
Linux信号 五 信号挂起与信号掩码操作接口集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
A signal may be blocked, which means that it will not be delivered
until it is later unblocked. Between the time when it is generated
and when it is delivered a signal is said to be pending.信號可以被阻塞,除非阻塞被解除否則不能將信號傳遞給進程。從信號產生到信號被解除
阻塞這一段時間稱之為掛起。Each thread in a process has an independent signal mask, which
indicates the set of signals that the thread is currently blocking.進程內的每個線程都有一個獨立的信號掩碼,信號掩碼是一組信號集合,表明當前線程
阻塞的信號。
Linux提供了一個新的數據結構用來實現信號掩碼的功能:信號集。多個信號組成的集合被稱為信號集,其數據類型為sigset_t。在Linux的實現中,sigset_t類型是位掩碼,每一個比特代表一個信號。
相關操作接口包括信號集初始化、添加、刪除、設置信號掩碼等:
sigemptyset, sigfillset, sigaddset, sigdelset, sigismember sigprocmask, pthread_sigmask#include <signal.h>/*** 初始化一個空的未包含任何信號的信號集。* 成功返回0,失敗返回-1并置errno */ int sigemptyset(sigset_t *set);/*** 初始化一個包含任何信號的信號集。* 成功返回0,失敗返回-1并置errno */ int sigfillset(sigset_t *set);/*** 向信號集中添加一個信號。* 成功返回0,失敗返回-1并置errno */ int sigaddset(sigset_t *set, int signum);/*** 從信號集中刪除一個信號。* 成功返回0,失敗返回-1并置errno */ int sigdelset(sigset_t *set, int signum);/*** 判斷該信號是否在信號集中* 屬于返回1,不屬于返回0,出錯返回-1并置errno*/ int sigismember(const sigset_t *set, int signum);/*** 將當前線程的信號集讀取到set結構體中* 成功返回0,失敗返回-1并置errno*/ int sigpending(sigset_t *set);Glibc擴展函數 如果定義了 _GNU_SOURCE 宏,signal.h還提供了額外三個參數用于操作信號集,不過 這些都是非標準的函數(其它系統可能有類似的實現),不能用于移植程序的開發中/*** 判斷信號集是否為空* 為空返回1,否則返回0*/ int sigisemptyset(const sigset_t *set);/*** 取left 和 right的并集,并存儲到dest結構體中* 成功返回0,失敗返回-1并置errno*/ int sigorset(sigset_t *dest, const sigset_t *left,const sigset_t *right); /*** 取left 和 right的交集,并存儲到dest結構體中* 成功返回0,失敗返回-1并置errno*/ int sigandset(sigset_t *dest, const sigset_t *left,const sigset_t *right);/*** 獲取或設置進程的阻塞信號掩碼** 根據參數how的值,提供了三種用于改變進程的阻塞信號掩碼方式** SIG_BLOCK:新的進程信號掩碼是當前信號掩碼與set指向信號集的并集,相當于在當前信號集* 掩碼中增加set的信號。** SIG_UNBLOCK: 新的進程信號掩碼是當前信號掩碼與set指向信號集的補集的交集,相當于從* 當前信號掩碼中刪除set中信號,解除對其的屏蔽。** SIG_SETMASK : 直接把進程的信號掩碼設置成set指向的信號集。** 如果參數oldset不為NULL,之前的信號掩碼配置將會存儲到該指針中。* 如果參數set為NULL的話,相當于不做任何改變。** 另外多線程中使用該函數的結果將是未定義的,多線程中最好使用pthread_sigmask()接口** 成功返回0,失敗返回-1并置errno*/ #include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);/*** 該函數功能和sigprocmask一樣,只不過是用在多線程中,用于改變調用線程的信號掩碼集。* * 成功返回0,失敗返回錯誤碼,編譯鏈接的時候加上-pthread選項。*/ #include <signal.h> int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);參考資料
1. 《Linux環境編程,從應用到內核》高峰,李彬著
2. man signal : http://www.man7.org/linux/man-pages/man7/signal.7.html
??? man sigsetops : http://www.man7.org/linux/man-pages/man3/sigsetops.3.html
總結
以上是生活随笔為你收集整理的Linux信号 五 信号挂起与信号掩码操作接口集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这是我在一舍宾训练管拍的,这些衣服都是要
- 下一篇: Linux信号 六 信号与线程的关系