linux 信号屏蔽
<span style="font-size:18px;">#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h> /*
sigemptyset(&newmask);//获取空屏蔽信号集
sigfillset(&newmask);//获取屏蔽了全部信号的屏蔽信号集。除了那两个SIGKILL SIGSTOP
sigpending(&pendmask);//获取进程中当前的屏蔽信号集 sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集增加SIGQUIT
(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集
(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集
(sigismember(&fillmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中
*/ static void sig_quit(int); int
main(void)
{
sigset_t newmask, oldmask, pendmask,fillmask; if (signal(SIGQUIT, sig_quit) == SIG_ERR)//设置信号处理函数
perror("can't catch SIGQUIT"); /*
* Block SIGQUIT and save current signal mask.
*/
sigemptyset(&newmask);//获取空屏蔽信号集
sigaddset(&newmask, SIGQUIT);//往空屏蔽信号集增加SIGQUIT
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//并集
perror("SIG_BLOCK error"); sleep(5); /* SIGQUIT here will remain pending */
//睡眠期间按下多次 ctrl+\ 未决信号集中之保留一次 if (sigpending(&pendmask) < 0)//获取进程中当前的屏蔽信号集
perror("sigpending error");
if (sigismember(&pendmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中
printf("\nSIGQUIT pending\n"); /*
* Restore signal mask which unblocks SIGQUIT.
*/
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//设置会原来的屏蔽信号集。因为SIGQUIT保留着一个未决信号,所以这里触发了信号处理函数,SIGQUIT变回默认处理
perror("SIG_SETMASK error");
printf("SIGQUIT unblocked\n"); sleep(5); /* SIGQUIT here will terminate with core file */ //在此期间按下 ctrl+\ 运行信号处理函数 ,调用默认处理。game over! printf("fillmask test\n"); if (sigfillset(&fillmask) < 0)//获取屏蔽了全部信号的屏蔽信号集,除了那两个SIGKILL SIGSTOP
perror("sigfillset error\n");
if (sigismember(&fillmask, SIGQUIT))//推断SIGQUIT是否在当前的屏蔽信号集中
printf("\nSIGQUIT pending\n");//在
if (sigprocmask(SIG_SETMASK,&fillmask , &oldmask) < 0)//设置屏蔽全部
perror("fillmask error\n"); sleep(5);
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)//假设在fillmask測试期间有按下ctrl+\。则以下不会睡眠5秒了。运行了SIGQUIT的默认处理函数
perror("SIG_SETMASK error\n"); sleep(5);
exit(0);
} static void
sig_quit(int signo)
{
printf("caught SIGQUIT\n");
//if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
// perror("can't reset SIGQUIT");
}
</span>
linux 信号屏蔽的更多相关文章
- 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数
34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- [Linux]信号集和sigprocmask信号屏蔽函数
一.概述 系统提供这样一种能力,就是创建一个信号集,然后传递给信号屏蔽函数,从而屏蔽向该进程发送的信号. 有一点需要注意的是,不能屏蔽SIGKILL和SIGSTOP信号. 信号集是sigset_t类型 ...
- Linux c 屏蔽信号、切换信号
信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1. 信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- Linux信号(signal) 机制分析
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- [置顶] Linux信号相关笔记
最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...
- Linux信号实践(4) --可靠信号
Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct si ...
随机推荐
- Linux命令之必须掌握的十条命令
Linux现如今已经成为了软件行业最流行的操作系统,掌握Linux就成为了每一个开发者必备的专业技能. 为了方便大家学习,大学君在此为大家整理了在使用Linux时必须掌握的十条命令,希望大家能熟练掌握 ...
- 使用ssh建立隧道和web代理
动态端口转发(socket4/5代理): 通过ssh监听本地端口并把数据转发至远程动态端口 转发local port 至 ssh Server ssh -D ssh -qfTnN -D 本地目标端口 ...
- Dinic 算法钩沉
最初是从<挑战程序设计竞赛>上了解到 Dinic 算法的.其中对于 Dinic 算法中的关键词--分层图(layered network,也称『层次图』)的引入的解释如下: 因为最短增广路 ...
- Resource 定位、BeanDefinition 的载入和解析,BeanDefinition 注册。
在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位.BeanDefinition 的载入和解析,BeanDefinition 注册. Resource 定位.我们一般用外部资源来描 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识
1.什么是WebService 学习 WebService 第一步:体系结构.三元素SOAP/WSDL/UDDI 2.什么是Axis2 Axis2是Apache一套崭新的WebService引擎(框架 ...
- java面试题之Error和Exception的区别
从概念角度分析: Error:程序无法处理的系统错误,编译器不做检查: Exception:程序可以处理的异常,捕获后可能恢复: 总结:前者是程序无法处理的错误,后者是可以处理的异常. 从责任角度分析 ...
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- vue + django 的权限控制
用vue做前端页面, Django 提供api, 写了一个后台系统,结合方式是vue打包后的dist目录直接作为Django的静态目录, 这样的好处是不用配置Nginx具体的做法不在这里写了,记一下遇 ...
- iOS开发之手势gesture详解(一)
前言 在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象 ...