日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux信号 五 信号挂起与信号掩码操作接口集

發布時間:2025/4/5 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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信号 五 信号挂起与信号掩码操作接口集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。