Linux信号 五 信号挂起与信号掩码操作接口集
生活随笔
收集整理的這篇文章主要介紹了
Linux信号 五 信号挂起与信号掩码操作接口集
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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.信號可以被阻塞,除非阻塞被解除否則不能將信號傳遞給進(jìn)程。從信號產(chǎn)生到信號被解除
阻塞這一段時間稱之為掛起。Each thread in a process has an independent signal mask, which
indicates the set of signals that the thread is currently blocking.進(jìn)程內(nèi)的每個線程都有一個獨(dú)立的信號掩碼,信號掩碼是一組信號集合,表明當(dāng)前線程
阻塞的信號。
Linux提供了一個新的數(shù)據(jù)結(jié)構(gòu)用來實(shí)現(xiàn)信號掩碼的功能:信號集。多個信號組成的集合被稱為信號集,其數(shù)據(jù)類型為sigset_t。在Linux的實(shí)現(xiàn)中,sigset_t類型是位掩碼,每一個比特代表一個信號。
相關(guān)操作接口包括信號集初始化、添加、刪除、設(shè)置信號掩碼等:
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);/*** 將當(dāng)前線程的信號集讀取到set結(jié)構(gòu)體中* 成功返回0,失敗返回-1并置errno*/ int sigpending(sigset_t *set);Glibc擴(kuò)展函數(shù) 如果定義了 _GNU_SOURCE 宏,signal.h還提供了額外三個參數(shù)用于操作信號集,不過 這些都是非標(biāo)準(zhǔn)的函數(shù)(其它系統(tǒng)可能有類似的實(shí)現(xiàn)),不能用于移植程序的開發(fā)中/*** 判斷信號集是否為空* 為空返回1,否則返回0*/ int sigisemptyset(const sigset_t *set);/*** 取left 和 right的并集,并存儲到dest結(jié)構(gòu)體中* 成功返回0,失敗返回-1并置errno*/ int sigorset(sigset_t *dest, const sigset_t *left,const sigset_t *right); /*** 取left 和 right的交集,并存儲到dest結(jié)構(gòu)體中* 成功返回0,失敗返回-1并置errno*/ int sigandset(sigset_t *dest, const sigset_t *left,const sigset_t *right);/*** 獲取或設(shè)置進(jìn)程的阻塞信號掩碼** 根據(jù)參數(shù)how的值,提供了三種用于改變進(jìn)程的阻塞信號掩碼方式** SIG_BLOCK:新的進(jìn)程信號掩碼是當(dāng)前信號掩碼與set指向信號集的并集,相當(dāng)于在當(dāng)前信號集* 掩碼中增加set的信號。** SIG_UNBLOCK: 新的進(jìn)程信號掩碼是當(dāng)前信號掩碼與set指向信號集的補(bǔ)集的交集,相當(dāng)于從* 當(dāng)前信號掩碼中刪除set中信號,解除對其的屏蔽。** SIG_SETMASK : 直接把進(jìn)程的信號掩碼設(shè)置成set指向的信號集。** 如果參數(shù)oldset不為NULL,之前的信號掩碼配置將會存儲到該指針中。* 如果參數(shù)set為NULL的話,相當(dāng)于不做任何改變。** 另外多線程中使用該函數(shù)的結(jié)果將是未定義的,多線程中最好使用pthread_sigmask()接口** 成功返回0,失敗返回-1并置errno*/ #include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);/*** 該函數(shù)功能和sigprocmask一樣,只不過是用在多線程中,用于改變調(diào)用線程的信號掩碼集。* * 成功返回0,失敗返回錯誤碼,編譯鏈接的時候加上-pthread選項。*/ #include <signal.h> int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);參考資料
1. 《Linux環(huán)境編程,從應(yīng)用到內(nèi)核》高峰,李彬著
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
總結(jié)
以上是生活随笔為你收集整理的Linux信号 五 信号挂起与信号掩码操作接口集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这是我在一舍宾训练管拍的,这些衣服都是要
- 下一篇: Linux信号 六 信号与线程的关系