<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 信号屏蔽的更多相关文章

  1. 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

    34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

  2. Linux信号-信号集&信号屏蔽字&捕捉信号【转】

    转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念    实际执行信号的处理 ...

  3. [Linux]信号集和sigprocmask信号屏蔽函数

    一.概述 系统提供这样一种能力,就是创建一个信号集,然后传递给信号屏蔽函数,从而屏蔽向该进程发送的信号. 有一点需要注意的是,不能屏蔽SIGKILL和SIGSTOP信号. 信号集是sigset_t类型 ...

  4. Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  5. Linux信号

    信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...

  6. Linux 信号详解五(信号阻塞,信号未决)

    信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...

  7. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  8. [置顶] Linux信号相关笔记

    最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...

  9. Linux信号实践(4) --可靠信号

    Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct si ...

随机推荐

  1. [OJ#15]TR #2 画心

    [OJ#15]TR #2 画心 试题描述 渠是一名画师.渠有一支神奇的画笔,可以画尽因果. 渠要画一幅画,这幅画由N个线段组成,线段从1开始编号,第i条线段有一个特殊的因果值Ai. 由于画太长了,渠不 ...

  2. APUE 学习笔记(五) 进程环境

    1.main函数 C程序总是从main函数开始执行,当内核执行C程序时,在调用main函数之前先调用exec函数从内核获取命令行参数和环境变量值   2.进程终止 正常终止: (1)在main函数内执 ...

  3. SharePoint 2013 中的 URL 和标记

    SharePoint 2013 中的 URL 的类型                SharePoint 2013 分析 URL 字符串以基于指定的协议(例如,http:)确定 URL 的格式或确定正 ...

  4. Notepad++中常用的插件【转】

    转自:http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_common_plugins.html 1.4. N ...

  5. 首次远程安装 GlassFish 后以远程 Web 方式访问其后台管理系统出现错误的解决方法(修订)

    首次远程安装 GlassFish 服务后,如果以远程 Web 方式访问其后台管理系统,会提示 Secure Admin must be enabled to access the DAS remote ...

  6. 开发使用mysql的一些必备知识点整理(二)查询

    简介 查询的基本语法 select * from 表名; from关键字后面写表名,表示数据来源于是这张表 select后面写表中的列名,如果是*表示在结果中显示表中所有列 在select后面的列名部 ...

  7. hdu 4514(树的直径+并查集)

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  8. AC日记——图灵机游戏 codevs 2292

    2292 图灵机游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description [Shadow 1]第二题 ...

  9. Javascript 限制文本字节数

    文本限制字数的问题,在实际开发中经常用到;主要问题出现在对中文的限制,下面代码就解决关于限制字节数的校验问题 以下是引用片段: /* value: 值: byteLength:数据库字节长度 titl ...

  10. linux source filename

    简单来说:source filename即把filename文件里的命令(命令集脚本文件)执行一遍,相当于在shell里逐个执行单条命令