功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。
用法:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数:
how:用于指定信号修改的方式,可能选择有三种

SIG_BLOCK //加入信号到进程屏蔽。
SIG_UNBLOCK //从进程屏蔽里将信号删除。
SIG_SETMASK //将set的值设定为新的进程屏蔽。

set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。
oldset:也是指向信号集的指针,在此存放原来的信号集。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为EINVAL。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
//#include <>

static void sig_quit(int signo)
{
printf("caught SIGQUIT\n");
signal(SIGQUIT, SIG_DFL);//将SIGQUIT的动作设为缺省值
}
int main()
{
sigset_t newmask;
sigset_t oldmask;
sigset_t pendmask;

signal(SIGQUIT, sig_quit);//信号量捕捉函数,捕捉到SIGQUIT,跳转到函数指针sig_quit处执行

sigemptyset(&newmask);//初始化信号量集
sigaddset(&newmask, SIGQUIT);//将SIGQUIT添加到信号量集中

sigprocmask(SIG_BLOCK, &newmask, &oldmask);//将newmask中的SIGQUIT阻塞掉,并保存当前信号屏蔽字到Oldmask

sleep (5);//休眠5秒钟,这里做说明:在5s休眠期间,任何SIGQUIT信号都会被阻塞,如果在5s内收到任何键盘的quit信号,则此时会把这些信息存在内核的队列中,等待5s结束后,可能要处理此信号。
sigpending(&pendmask);//检查信号是悬而未决的,if (sigismember(&pendmask, SIGQUIT))//SIGQUIT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
{
printf("\nSIGQUIT pending\n");
}
sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢复被屏蔽的信号SIGQUIT

/**开始处理信号,调用信号处理函数*/
printf("SIGQUIT unblocked\n");

sleep(5);//再次休眠5秒钟

return (0);

}
以上示例是Linux redhat,
执行结果是
$./a.out
^\                        /**此处使用"CTRL+\" 产生SIGQUIT */
SIGQUIT pending
caught SIGQUIT 在sigprocmask返回之前处理阻塞信号SIGQUIT,输出它
SIGQUIT unblocked
^\Quit (coredump)//因为已经被设置为缺省值,所以再次产生SIGQUIT 信号,直接退出

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/legendox/archive/2009/09/25/4593317.aspx

转载于:https://www.cnblogs.com/stli/archive/2010/03/11/1683546.html

sigprocmask系统调用相关推荐

  1. sigprocmask和sigsuspend转

    有2个函数 sigprocmask和sigsuspend sigprocmask系统调用用于改变当前阻塞信号集,比如进程想阻塞SIGMIN+1信号.就把这个信号加入掩码中,然后调用 sigprocma ...

  2. 以SIGSEGV为例详解信号处理(与栈回溯)

    以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...

  3. linux信号掩码线程,20.10 信号掩码(阻塞信号传递)

    20.10  信号掩码(阻塞信号传递) 内核会为每个进程维护一个信号掩码,即一组信号,并将阻塞其针对该进程的传递.如果将遭阻塞的信号发送给某进程,那么对该信号的传递将延后,直至从进程信号掩码中移除该信 ...

  4. Linux系统编程-信号入门2

    早,继续记录我的学习心得. 分享一个关于机械练习和有目的练习的看法. 机械的练习: 只是埋头干!我刚刚挥起球拍,努力去击球.我刚刚听到了那些数字,想办法去记住.我刚刚看到了那些数学题,正试着解答. 有 ...

  5. 6、Linux多进程开发

    1.程序概述 1.1 程序 程序是包含一系列信息的文件(占用磁盘,不占用内存.CPU),这些信息描述了如何在运行时创建一个进程: 二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息.内核 ...

  6. Linux 信号学习

    Linux 信号学习 信号量的基本概念 信号产生的条件 信号如何被处理 信号的异步特质 信号的分类 可靠信号/不可靠信号 实时信号/非实时信号 常见信号与默认行为 信号处理 `signal()` 函数 ...

  7. 十四、Linux系统编程-信号(一)中断、信号、中断和信号

    一.中断 (1).中断概念       中断是用以提高计算机工作效率.增强计算机功能的一项重要技术.最初引入硬件中断,只是出于性能上的考量.如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向 ...

  8. linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...

    原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...

  9. 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表

    文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...

最新文章

  1. 【linux系统】maven安装
  2. delphi初级教程之delphi断点调试二
  3. C# 开发圆角控件的具体实现
  4. gpedit msc组策略面板 win10在哪里_windows10的组策略在哪
  5. HTML5 上传图片预览
  6. (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)
  7. chmod命令文件权限属性设置
  8. SICP Python 描述 翻译完成
  9. excel日期格式改不了_画进度计划横道图,Excel就够了
  10. error: ‘PRIO_PROCESS’ undeclared
  11. python代码控制机械臂_Dobot 机械臂
  12. 【锐捷无线】加密配置
  13. html页面旋转图标或标签
  14. umail for linux,U-Mail邮件系统 for CentOS(6.X) x64
  15. obs-studio 二次封装 (四)obs 音视频采集到推流大体流程图
  16. 大学寒假这样过,过完惊艳所有人,不只是你的宿友,mysql基础教程西泽pdf
  17. ale插件 vim_vim ale插件详情
  18. 已知a和b的最大公因数和最小公倍数求这两个数字
  19. securecrt 不掉线_如何不掉线
  20. [笔记]-后端学习笔记

热门文章

  1. 电子商务商品供应链概论
  2. matlab求方程实根,简单迭代法求方程根的MATLAB程序
  3. 系统学习NLP(二十三)--浅谈Attention机制的理解
  4. 关联分析(三)--GSP算法
  5. 纯命令版饥荒安装教程-自己使用
  6. “21天好习惯”第一期-9
  7. 小学计算机课教学工作总结,小学六年级信息技术教学工作总结
  8. html图像区域映射菜鸟,HTML area 标签 | w3cschool菜鸟教程
  9. 【Java程序设计】类的重用
  10. k8s与caas--容器云caas平台的落地实践