[2022.8.20][10 信号]使用sigprocmask函数阻塞SIGQUIT信号
1 相关函数介绍
1.1 信号集函数
sigset_t表示一个信号集,如下为5个处理信号集的函数:
#include <signal.h>//成功返回0,出错返回-1
int sigemptyset(sigset_t *set);
//成功返回0,出错返回-1
int sigfillset(sigset_t *set);
//成功返回0,出错返回-1
int sigaddset(sigset_t *set, int signo);
//成功返回0,出错返回-1
int sigdelset(sigset_t *set, int signo);//成功返回1,出错返回0
int sigismember(const sigset_t *set, int signo);
sigemptyset用来初始化set指向的信号集,清除其中所有信号。
sigfillset用来初始化set指向的信号集,使得其包含所有信号。
sigaddset用来添加一个信号到信号集中。
sigdelset用来从信号集中删除一个信号。
1.2 sigprocmask函数
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。
函数sigprocmask可以检测或更改进程的信号屏蔽字。
#include <signal.h>//成功返回0,出错返回-1
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
若oset是非空指针,那么当前信号屏蔽字通过oset返回。
若set是非空指针,则参数how表示如何修改当前信号屏蔽字;若set是空指针,则how无意义。
how |
说明 |
SIG_BLOCK |
该进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集的并集。 set包含了希望阻塞的附加信号。 |
SIG_UNBLOCK |
该进程新的信号屏蔽字是当前信号屏蔽字和set指向信号集补集的交集。 set包含了希望解除的附加信号。 |
SIG_SETMASK |
该进程新的信号屏蔽字是set指向的值。 |
SIG_BLOCK是或操作。SIG_SETMASK是赋值操作。
注意,不能阻塞SIGKILL和SIGSTOP信号。
在调用sigprocmask后如果有不再阻塞的信号,则在sigprocmask返回前,至少将其中之一递送给该进程。
sigprocmask是仅为单线程进程定义的。
1.3 sigpending函数
sigpending函数返回一信号集,对于调用进程而言,其中的各信号是阻塞不能递送的,因而一定是当前未决的。
#include <signal.h>int sigpending(sigset_t *set);
即查下当前哪些信号是阻塞的。
2 使用sigprocmask函数阻塞SIGQUIT信号
如下进程会阻塞SIGQUIT信号,休眠5s。然后不再阻塞SIGQUIT信号,休眠5s。
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>static void sig_quit(int);int main(void)
{sigset_t newmask, oldmask, pendmask;if (signal(SIGQUIT, sig_quit) == SIG_ERR)printf("can't catch SIGQUIT");//1 Block SIGQUIT and save current signal mask.sigemptyset(&newmask);sigaddset(&newmask, SIGQUIT);if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)printf("SIG_BLOCK error");sleep(5); //2 SIGQUIT here will remain pendingif (sigpending(&pendmask) < 0)printf("sigpending error");if (sigismember(&pendmask, SIGQUIT))printf("\nSIGQUIT pending\n");//3 Restore signal mask which unblocks SIGQUIT.printf("SIGQUIT unblocked >>>\n");if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)printf("SIG_SETMASK error");printf("SIGQUIT unblocked <<<\n");sleep(5); //4 SIGQUIT here will terminate with core fileexit(0);
}static void sig_quit(int signo)
{printf("caught SIGQUIT -------\n");if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) //使SIGQUIT信号恢复默认行为(退出+core)printf("can't reset SIGQUIT");
}
操作1:在第一次休眠5s内产生一次SIGQUITI信号(ctrl+\),在第二次休眠5s内产生一次SIGQUIT信号(ctrl+\)。
测试1结果如下:
^\SIGQUIT pending
SIGQUIT unblocked >>>
caught SIGQUIT -------
SIGQUIT unblocked <<<
^\ 退出(核心已转储)
在第一次休眠5s内产生的SIGQUIT信号,这时信号是未决的,在sigprocmask解除block后,SIGQUIT信号不再被阻塞,立刻被递送到调用进程,
信号处理函数sig_quit捕捉到SIGQUIT后,按照自定义处理,处理完后使SIGQUIT信号恢复为默认行为(退出+core)。
操作2:在第一次休眠5s内产生多次SIGQUITI信号(ctrl+\),在第二次休眠5s内产生一次SIGQUIT信号(ctrl+\)。
测试2结果如下:
^\^\^\^\^\
SIGQUIT pending
SIGQUIT unblocked >>>
caught SIGQUIT -------
SIGQUIT unblocked <<<
^\ 退出(核心已转储)
在第一次休眠5s内产生多个SIGQUIT信号,从结果来看,只有一个信号会递送给调用进程。
[2022.8.20][10 信号]使用sigprocmask函数阻塞SIGQUIT信号相关推荐
- python基本的信号与槽函数的使用 信号发射 槽函数接收
# 熟悉信号与槽的使用 # -*- coding: utf-8 -*- from PyQt5.QtWidgets import * from PyQt5.QtCore import * import ...
- linux信号掩码线程,20.10 信号掩码(阻塞信号传递)
20.10 信号掩码(阻塞信号传递) 内核会为每个进程维护一个信号掩码,即一组信号,并将阻塞其针对该进程的传递.如果将遭阻塞的信号发送给某进程,那么对该信号的传递将延后,直至从进程信号掩码中移除该信 ...
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL 默 ...
- C语言 信号集回调函数 避免子进程在信号回调注册完成之前全部结束
// ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区 释放资源 */// ...
- C语言 sigaction函数捕捉信号 注册回调函数
// ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区 释放资源 */// ...
- _Linux系统编程—信号集操作函数
先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...
- linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数
信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- 给定一组查找关键字(19,14,23,1,65,20,84,27,55,11,10,79) 哈希函数为:H(key)=key % 13, 哈希表长为m=15,设每个记录的查找概率相等。【MOOC】
目 录 题 目①[关键字(19, 14, 23, 1, 65, 20, 84, 27, 55, 11, 10, 79)] 解法一(线性探测再散列) 解法二(链地址法) 题 目②[关键字(19, 1 ...
最新文章
- TOMCAT学习笔记
- 计算机删除默认共享怎样操作,如何清除计算机默认共享隐患
- java 如何把源码导出为jar包,以及如何使用导出的jar包
- 【ARM】MRS MSR指令
- 查看topic信息_如何规划的你博客文章主题(Topic)
- 项目管理平台(总结篇二)
- window下搭建linux虚拟机
- C++ Exercises(十六)---Ethernet帧包结构解析
- 如何给一个文件重命名?
- 编译与运行ORB-SLAM的问题:1、unistd.h 2、virtual memory exhausted 3、internal compiler error 4、共享文件夹设置
- 最新手机号段 归属地数据库(20191210,共439265条,包括最新的号段)
- linux kernel 报错:FATAL: kernel too old
- 好的计算机书籍 http://outmyth.blogdriver.com/outmyth/1122212.html
- 点线面的融会贯通学习方法探讨
- 为什么投资旅游景区赚钱难?怎样让景区快速盈利?
- Android返回桌面代码,安卓 双击返回键 返回桌面
- Android 开源交流 QQ 群分享汇总
- Android QuickSearchBox全局搜索
- VS 官方历史版本下载
- Python解题 - CSDN周赛第25期 - 水池注水
热门文章
- 重邮计算机专业取得奖项,重庆邮电大学移通学院学子在2019中国大学生计算机设计大赛全国总决赛中喜获四项国家级奖励...
- mysql一张表拆成多张表思路方案实现
- 抖音最火python_抖音超火的九宫格视频是如何生成的,Python 告诉你答案
- Java根据excel/word模板进行值替换并且打成压缩包
- QT下载安装调试运行(QT5.5.1+VS2013)
- MYSQL 8.0 WORKBENCH使用LOAD DATA LOCAL INFILE报错解决方案
- button渐变色 ios_IOS控件渐变色实现
- 张蕾:北斗链社区发展白皮书
- 张蕾:截至目前,区块链有没有真正的落地应用?
- 背单词软件 基于VS2019 EasyX (C语言实现)