【信號】信號集、sigprocmask、sigpending

一、信號集操作函數

內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在用程序自定義set來改變mask,來達到屏蔽指定信號目的。

sigset_t set;                                        // typedef unsigned long sigset_t
int sigemptyset(sigset_t *set)                       // 將某個信號集清0
int sigfillset(sigset_t *set)                        // 將某個信號集置1
int sigaddsetset(sigset_t *set, int sino)            // 將某個信號加入信號集
int sigdelset(sigset_t *set, int signo)              // 將某個信號清出信號集
int sigismember(cosnt sigset_t *set, int signum);    // 判斷某個信號是否在信號集中  

?

二、函數sigprocmask

1. 函數原型:用來屏蔽信號、解除信號屏蔽使用該函數,其本質,讀取或修改進程的信號屏蔽字(PCB)

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

分析:

  • set:傳入參數,是一個位圖,set中哪個位置置為1,就表示當前進程屏蔽了哪個信號
  • oldset:傳出參數,保存舊的信號屏蔽集
  • how參數取值
how說明
SIG_BLOCK當how設置為此值,set表示需要屏蔽的信號
SIGB_UNBLOCK當how設置為此值,set表示需要解除屏蔽的信號
SIG_SETMASK

當how設置為此值,set表示用于替代原始屏蔽集的新屏蔽集,相當于mask = set,若調用sigprocmask解除了對當前信號若干個信號的阻塞,則在sigprocmask返回前,至少將其中一個信號遞達。

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

?

三、函數sigpending

? ? ?函數作用:讀取當前信號的未決信號集

int sigpending(sigset_t *set);     //set傳出參數

?

四、程序清單

1. 測試代碼

#include <stdio.h>
#include <signal.h>
#include <unistd.h>void printped(sigset_t *ped)
{int i;for (i = 1; i < 32; i++) {if (sigismember(ped, i) == 1) putchar('1');else putchar('0');}printf("\n");
}int main()
{sigset_t myset, oldset, ped;sigemptyset(&myset);sigaddset(&myset, SIGQUIT); // Ctrl + /sigaddset(&myset, SIGINT);  // Ctrl + Csigaddset(&myset, SIGTSTP); // Ctrl + Zsigaddset(&myset, SIGSEGV);sigaddset(&myset, SIGKILL);  //無法被屏蔽sigprocmask(SIG_BLOCK, &myset, &oldset);while (1) {sigpending(&ped);printped(&ped);sleep(2);}return 0;
}

輸出結果:

?

?

2. 測試代碼

#include <unistd.h> 
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>void handler(int sig);void printsigset(sigset_t *set)
{int i;for (i = 1; i < 32; ++i) {if (sigismember(set, i))putchar('1');elseputchar('0');}printf("\n");
}int main(int argc, char *argv[])
{sigset_t pset;sigset_t bset;sigemptyset(&bset);sigaddset(&bset, SIGINT);if (signal(SIGINT, handler) == SIG_ERR) {perror("signal error");exit(1);}if (signal(SIGQUIT, handler) == SIG_ERR) {perror("signal error");exit(1);}sigprocmask(SIG_BLOCK, &bset, NULL);for (; ;) {sigpending(&pset);printsigset(&pset);sleep(1);}return 0;
}void handler(int sig)
{if (sig == SIGINT)printf("recv a sig = %d\n", sig);else if (sig == SIGQUIT) {sigset_t uset;sigemptyset(&uset);sigaddset(&uset, SIGINT);sigprocmask(SIG_UNBLOCK, &uset, NULL);}
}

輸出結果:

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

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

相關文章

一招讓你拿下seata分布式事務框架,看這篇文章準沒錯!

第一階段&#xff1a;架構師筑基必備技能 我覺得&#xff0c;但凡是個成年人應該都清楚扎實的基本功對自己的工作幫助有多重要。從各大招聘網站的招聘要求來看&#xff0c;第一條都明確說明需要扎實的Java基礎。因此&#xff0c;一般筆試以及面試的第一輪&#xff0c;對基礎的…

函數signal、sigaction

二、函數sigaction 修改信號處理動作(通常在Linux用來注冊一個信號的捕捉函數) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 參數&#xff1a; act&am…

一文了解OOM及解決方案,你還看不明白?

InnoDB總體結構 首先我們來看官網的一張圖(圖片來源于MySQL官網)&#xff1a; 從上圖中可以看出其主要分為兩部分結構&#xff0c;一部分為內存中的結構(上圖左邊)&#xff0c;一部分為磁盤中的結構(上圖右邊) 內存結構 InnoDB內存中的結構主要分為&#xff1a;Buffer Pool,…

信號 09 | 函數pause

函數pause 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒&#xff0c;調用該系統調用的進程處于阻塞狀態(主動放棄CPU)直到有信號遞達將其喚醒。 將進程置為可中斷睡眠狀態。然后 它調用schedule()&#xff0c;使linux進程調度器找到另一個進程來運行。pause使調用…

一文搞懂JVM架構和運行時數據區,全網最新

1.Java基礎面試知識點 Java中和equals和hashCode的區別int、char、long各占多少字節數int與integer的區別探探對Java多態的理解String、StringBuffer、StringBuilder區別什么是內部類&#xff1f;內部類的作用抽象類和接口區別抽象類的意義抽象類與接口的應用場景抽象類是否可…

一條正確的Java職業生涯規劃,幫你突破瓶頸

面試題模塊介紹&#xff1a; 一、Java 基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【線程】線程基本函數

一、pthread_self函數 功能&#xff1a;獲取線程ID。 pthread_t pthread_self(void); 線程ID&#xff1a;pthread_t類型&#xff0c;本質&#xff1a;在Linux為無符號整數(%lu)&#xff0c;其他系統可能是結構體實現線程ID是進程內部識別標志。&#xff08;兩個進程間&#…

一條正確的Java職業生涯規劃,順利通過阿里Java崗面試

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

線程控制 12 | 線程屬性

本節作為指引性介紹&#xff0c;linux下線程的屬性是可以根據實際項目需要&#xff0c;進行設置&#xff0c;之前我們討論的線程都是采用線程的默認屬性&#xff0c;默認屬性已經可以解決絕大部分開發遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性&#x…

一次違反常規的Java大廠面試經歷,系列教學

第一部分 Java相關以及答案 答案 第二部分算法跟編程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分數據庫部分 答案 第六部分XML部分 答案 第七部分.流行的框架與新技術 答案 第八、九部分.軟件工程與設計模式以及j2ee部分 最后 筆者…

函數perror、strerror

perror函數 函數原型&#xff1a; #include<stdio.h> void perror(const char *msg); 測試代碼&#xff1a; #include<unistd.h> #include<errno.h> #include<stdio.h>int main() {int ret;ret close(10);if(ret -1) {perror("close error…

一次違反常規的Java大廠面試經歷,重難點整理

目錄 Kafka的基本介紹Kafka的設計原理分析Kafka數據傳輸的事務特點Kafka消息存儲格式副本&#xff08;replication&#xff09;策略Kafka消息分組&#xff0c;消息消費原理Kafak順序寫入與數據讀取消費者&#xff08;讀取數據&#xff09; Kafka的基本介紹 Kafka是最初由Lin…

一步搞定你疑惑的數據結構與算法系列,原理+實戰講解

螞蟻金服一面&#xff1a; 下午杭州的電話&#xff0c;問有沒有空&#xff0c;果斷有空&#xff0c;雖然感覺略顯緊張&#xff0c;有點懵逼。 面試的題目&#xff1a; HashMap和Hashtable的區別實現一個保證迭代順序的HashMap說一說排序算法&#xff0c;穩定性&#xff0c;復…

互斥量(互斥鎖)

一、互斥量mutex Linux提供一把互斥鎖mutex(也稱之為互斥量)每個線程在對資源操作前都嘗試先加鎖&#xff0c;成功加鎖才能操作&#xff0c;操作結束后解鎖。資源還是共享的&#xff0c;線程間也還是競爭的&#xff0c;但通過鎖將資源的訪問變為互斥操作&#xff0c;而后與時間…

一眼就能看懂的Java自學手冊,終局之戰

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

Centos 6.x

1. centos升級gcc教程&#xff1a;鏈接 2. 虛擬機中的Centos聯通網絡&#xff1a;鏈接 3. 虛擬機安裝Centos7系統教程&#xff1a;鏈接

Java虛擬機學習集錦是我攢來的,帶你碾壓面試官!

1. 一致性&#xff08;Consistency&#xff09; 一致性&#xff08;Consistency&#xff09;是指多副本&#xff08;Replications&#xff09;問題中的數據一致性。可以分為強一致性、順序一致性與弱一致性。 1.1 強一致性&#xff08;Strict Consistency&#xff09; 也稱為…

Java虛擬機學習集錦是我攢來的,看這篇文章準沒錯!

一面 介紹一下自己 問項目經歷, 聊"數據同步" 接著聊上了 K8S 的項目 有沒有什么鉆研得比較深得技術&#xff1f;&#xff08;大佬&#xff1a;kubernetes, golang, prometheus, java&#xff09; kubernetes 的架構是怎么樣的? 這個問題很大&#xff0c;拆成 …

文件描述符、函數open和openat

文件描述符 pcb&#xff1a;結構體一個進程有一個文件描述符&#xff1a;1024文件描述符&#xff1a;尋找磁盤文件函數open和openat 函數原型&#xff1a; include<sys/stst.h> #include<fcntl.h>int open(const char *pathname, int flags); int open(const ch…

Java這些高端技術只有你還不知道,移動架構師成長路線

并發編程共享模型篇 并發編程概覽進程與線程Java線程共享模型之管程共享模型之內存共享模型之無鎖共享模型之不可變共享模型之工具 共享模型之管程 原理之 Monitor(鎖) 原理之偽共享 模式篇—正確姿勢 同步模式之保護性智停同步模式之Blking同步模式之順序控制異步模式之生產…