信號集操作函數

內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在應用程序中自定義set來改變mask。已達到屏蔽指定信號的目的。綜上:自定義信號集set(也為一個字,64位)通過信號集操作函數來改變信號屏蔽字mask,然后mask進一步來影響未決信號集,從而控制信號是否應該被屏蔽。后面我們只是研究常規信號,即1~31號!

1)信號集的設置

sigset_t? set;???????? // typedef unsigned long sigset_t; ?聲明一個信號集變量set,信號集類型為sigset_t,為unsigned long(無符號長整型),64位。

int sigemptyset(sigset_t *set);?????? //將set所指信號集清0??????? 成功:0;失敗:-1

int sigfillset(sigset_t *set);??????????? //將set所指信號集置1??????? 成功:0;失敗:-1

int sigaddset(sigset_t *set, int signum); ?????? //將某個信號加入信號集(即將其置1)? 成功:0;失敗:-1

int sigdelset(sigset_t *set, int signum);? ?????? //將某個信號清出信號集(即將其置0)? 成功:0;失敗:-1

int sigismember(const sigset_t *set, int signum); 判斷某個信號是否在信號集中(是否為1)返回值:在集合:1;不在:0;出錯:-1?

sigset_t類型的本質是位圖。但不應該直接使用位操作,而應該使用上述函數,保證跨系統操作有效。

對比認知select 函數。

2sigprocmask函數

用來屏蔽信號或解除屏蔽,即用于讀取和修改進程的信號屏蔽字mask。在用戶設置好自己的信號集set后,通過sigprocmask函數,可以利用set來對mask進行修改,以實現屏蔽和解除屏蔽的目的。

注意:屏蔽信號只是將信號處理延后執行(延至解除屏蔽);而忽略表示將信號丟棄處理。

?

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);???

返回值: 成功:0;失敗:-1,設置errno

參數how1.SIG_BLOCK: 當how設置為此值,set表示需要屏蔽的信號。相當于 mask = mask|set,即將set中為1的信號添加到mask中,mask中原有的信號不變;2.SIG_UNBLOCK: 當how設置為此,set表示需要解除屏蔽的信號。相當于 mask = mask & ~set(先對set位取反,再位與操作),即將set中為1的信號對應的mask中將其置為0(解除屏蔽),其余信號不變;3.SIG_SETMASK:當how設置為此,set表示用于替代mask的新屏蔽集。相當于 mask = set。調用sigprocmask解除了對當前若干個信號的阻塞,則在sigprocmask返回前,至少將其中一個信號遞達。

參數set傳入參數,是一個位圖,自己設置。

參數oldset傳出參數,保存舊的信號屏蔽集,即在該函數對mask處理前的mask的值。 如果不關心上一次的屏蔽字mask是什么,第三個參數可以設為NULL

3sigpending函數

作用:讀取當前進程的未決信號集

int sigpending(sigset_t *set);?? set傳出參數。?? 返回值:成功:0;失敗:-1,設置errno

?

//練習:編寫程序。把所有常規信號的未決狀態打印至屏幕。?????

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void printset(sigset_t *ped)  //打印出ped所指信號集的前1~31位(常規信號)
{int i;for(i = 1; i < 32; i++){if( (sigismember(ped, i) == 1) ){putchar('1');     //標準輸出} else if( (sigismember(ped, i) == 0) ) {putchar('0');} else {perror( “sigismember”);exit(1);}}printf("\n");
}int main(void)
{sigset_t set, ped;
#if 0   sigemptyset(&set);   //清0sigaddset(&set, SIGINT);   //加入2號信號sigaddset(&set, SIGQUIT);   //加入3號信號sigaddset(&set, SIGKILL);  //加入9號信號,記住其不可以被阻塞、忽略和捕捉sigaddset(&set, SIGSEGV);  //加入11號信號
#endifsigfillset(&set);    //全部置1,則所有信號全部設置為阻塞sigprocmask(SIG_BLOCK, &set, NULL);     //不獲取原屏蔽字while(1){sigpending(&ped);       //獲取未決信號集printset(&ped);sleep(1);}return 0;
}

[root@localhost 01_signal_test]# ./sigpending

0000000000000000000000000000000

0000000000000000000000000000000

^Z0000000000000000000100000000000? //Ctrl +Z? 20號信號

^C0100000000000000000100000000000? //Ctrl +C? 2號信號

^\0110000000000000000100000000000?? //Ctrl +\? ?3號信號

0110000000000000000100000000000???

0110000000000000000100000000000

0110000000000000000100000000000

0110000000100000000100000000000? //? [root@localhost ~]# kill -11 5710

?

通過以上可以看出:發送的信號全部被阻塞,在未決信號集中都置為1。最后發送9號信號,殺死該進程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信號捕捉(signal、sigaction)

信號的基本屬性&#xff1a;軟中斷&#xff0c;由內核發送&#xff0c;內核處理。某個進程通過內核向另一個進程發送信號時&#xff08;引起信號產生的五個因素&#xff09;&#xff0c;另一個進程將會陷入內核進行中斷處理&#xff0c;未決信號集中相應信號置1&#xff0c;當遞…

1090 Highest Price in Supply Chain (25)(25 分)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;經銷商&#xff09;, and suppliers&#xff08;供應商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

時序競態(競態條件)

產生原因&#xff1a;仍然以前文實現的sleep函數為例&#xff0c;如果進程在執行完alarm函數后&#xff0c;突然失去CPU&#xff0c;被阻塞等待&#xff08;這是有可能的&#xff0c;進程在執行過程中&#xff0c;若非原子操作&#xff0c;都有可能隨時失去CPU&#xff09;&…

1106 Lowest Price in Supply Chain (25)

A supply chain is a network of retailers&#xff08;零售商&#xff09;, distributors&#xff08;經銷商&#xff09;, and suppliers&#xff08;供應商&#xff09;-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

【Leetcode | 順序刷題 】二分查找目錄

二分查找序號題號129. 兩數相除 50. Pow(x, n) 69. x 的平方根

sigsuspend函數(mysleep函數的改進)

可以通過設置屏蔽SIGALRM的方法來控制程序執行邏輯&#xff0c;但無論如何設置&#xff0c;程序都有可能在“解除信號屏蔽”與“掛起等待信號”這個兩個操作間隙失去cpu資源。除非將這兩步驟合并成一個“原子操作”。sigsuspend函數具備這個功能。在對時序要求嚴格的場合下都應…

【Leetcode | 順序刷題】數學目錄

序號題號1 7. 整數反轉 28. 字符串轉換整數 (atoi)39. 回文數443. 字符串相乘

全局變量的異步I/O問題

全局變量的異步I/O問題同樣屬于時序競態問題&#xff0c;其本質就是多個進程或者同一個進程中的多個時序&#xff08;如主控程序和信號捕捉時的用戶處理函數&#xff09;對同一個變量進行修改時&#xff0c;它們的執行順序不一樣就會導致該變量最終的值不一樣&#xff0c;從而產…

【Leetcode | 03】String

字符串目錄序號題號33. 無重復字符的最長子串 151. 翻轉字符串里的單詞

可/不可重入函數

一個函數在被調用執行期間&#xff08;尚未調用結束&#xff09;&#xff0c;由于某種時序&#xff08;遞歸或者處理信號捕捉時等情況&#xff09;又被重復調用&#xff0c;稱之為“重入”。根據函數實現的方法可分為“可重入函數”和“不可重入函數”兩種。看如下程序。 可以看…

【Leetcode | 順序刷題】雜項目錄

序號題號類別1136. 只出現一次的數字位運算2137. 只出現一次的數字 II位運算3 260. 只出現一次的數字 III 位運算4191. 位1的個數位運算5231. 2的冪位運算6342. 4的冪位運算7 338. 比特位計數 位運算8405. 數字轉換為十六進制數位運算9371. 兩整數之和位運算10401. 二進制手表位…

SIGCHLD信號

&#xff08;1&#xff09;SIGCHLD信號產生的條件 1.子進程終止時會向父進程發送SIGCHLD信號&#xff0c;告知父進程回收自己&#xff0c;但該信號的默認處理動作為忽略&#xff0c;因此父進程仍然不會去回收子進程&#xff0c;需要捕捉處理實現子進程的回收&#xff1b; 2.子…

信號傳參

&#xff08;1&#xff09;發送信號傳參 前面已經知道從一個進程向另一個進程發送信號可以使用kill函數&#xff0c;但是kill函數在向進程發送信號的時候不能攜帶除了信號以外的其他信息&#xff0c;這時可以使用與kill相對應的sigqueue函數&#xff0c;該函數也是向一個進程發…

【Leetcode | 52】257. 二叉樹的所有路徑

給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 1 / \ 2 3 \ 5 輸出: ["1->2->5", "1->3"] 解釋: 所有根節點到葉子節點的路徑為: 1->2->5, 1->3 解法一&a…

623. 在二叉樹中增加一行

給定一個二叉樹&#xff0c;根節點為第1層&#xff0c;深度為 1。在其第 d 層追加一行值為 v 的節點。 添加規則&#xff1a;給定一個深度值 d &#xff08;正整數&#xff09;&#xff0c;針對深度為 d-1 層的每一非空節點 N&#xff0c;為 N 創建兩個值為 v 的左子樹和右子樹…

終端的概念

操作系統接口&#xff1a;用戶接口和程序接口。用戶接口分為聯機用戶接口和脫機用戶接口。脫機用戶接口出現在早期的批處理系統中&#xff08;將作業提前交給操作系統&#xff0c;作業完成的過程中用戶無法交互&#xff09;&#xff1b;聯機用戶接口即為終端&#xff08;所有輸…

終端的啟動流程

在Linux操作系統啟動時&#xff0c;首先加載的進程就是init進程&#xff08;ID為1&#xff09;&#xff0c;其余進程都是init進程產生的&#xff08;fork&#xff0c;然后exec金蟬脫殼&#xff09;&#xff0c;因此系統中所有進程都可以看成是init進程的子孫進程。可以通過ps a…

進程組(作業)

&#xff08;1&#xff09;概念和特性 進程組&#xff0c;也稱之為作業。BSD于1980年前后向Unix中增加的一個新特性。代表一個或多個進程的集合。每個進程都屬于一個進程組。在waitpid函數和kill函數的參數中都曾使用到。操作系統設計的進程組的概念&#xff0c;是為了簡化對多…

437. 路徑總和 III

給定一個二叉樹&#xff0c;它的每個結點都存放著一個整數值。 找出路徑和等于給定數值的路徑總數。 路徑不需要從根節點開始&#xff0c;也不需要在葉子節點結束&#xff0c;但是路徑方向必須是向下的&#xff08;只能從父節點到子節點&#xff09;。 二叉樹不超過1000個節…

會話(session)

一組進程形成一個進程組&#xff0c;一組進程組形成一個會話&#xff0c;即一個會話中可以包括多個進程組。 &#xff08;1&#xff09;創建會話 創建一個會話需要注意以下6點注意事項&#xff1a;1.調用進程不能是進程組組長&#xff08;不能是父進程&#xff09;&#xff0…