sigprocmask系统调用
功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。
用法:
#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系统调用相关推荐
- sigprocmask和sigsuspend转
有2个函数 sigprocmask和sigsuspend sigprocmask系统调用用于改变当前阻塞信号集,比如进程想阻塞SIGMIN+1信号.就把这个信号加入掩码中,然后调用 sigprocma ...
- 以SIGSEGV为例详解信号处理(与栈回溯)
以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...
- linux信号掩码线程,20.10 信号掩码(阻塞信号传递)
20.10 信号掩码(阻塞信号传递) 内核会为每个进程维护一个信号掩码,即一组信号,并将阻塞其针对该进程的传递.如果将遭阻塞的信号发送给某进程,那么对该信号的传递将延后,直至从进程信号掩码中移除该信 ...
- Linux系统编程-信号入门2
早,继续记录我的学习心得. 分享一个关于机械练习和有目的练习的看法. 机械的练习: 只是埋头干!我刚刚挥起球拍,努力去击球.我刚刚听到了那些数字,想办法去记住.我刚刚看到了那些数学题,正试着解答. 有 ...
- 6、Linux多进程开发
1.程序概述 1.1 程序 程序是包含一系列信息的文件(占用磁盘,不占用内存.CPU),这些信息描述了如何在运行时创建一个进程: 二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息.内核 ...
- Linux 信号学习
Linux 信号学习 信号量的基本概念 信号产生的条件 信号如何被处理 信号的异步特质 信号的分类 可靠信号/不可靠信号 实时信号/非实时信号 常见信号与默认行为 信号处理 `signal()` 函数 ...
- 十四、Linux系统编程-信号(一)中断、信号、中断和信号
一.中断 (1).中断概念 中断是用以提高计算机工作效率.增强计算机功能的一项重要技术.最初引入硬件中断,只是出于性能上的考量.如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向 ...
- linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...
原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...
- 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表
文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...
最新文章
- 【linux系统】maven安装
- delphi初级教程之delphi断点调试二
- C# 开发圆角控件的具体实现
- gpedit msc组策略面板 win10在哪里_windows10的组策略在哪
- HTML5 上传图片预览
- (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)
- chmod命令文件权限属性设置
- SICP Python 描述 翻译完成
- excel日期格式改不了_画进度计划横道图,Excel就够了
- error: ‘PRIO_PROCESS’ undeclared
- python代码控制机械臂_Dobot 机械臂
- 【锐捷无线】加密配置
- html页面旋转图标或标签
- umail for linux,U-Mail邮件系统 for CentOS(6.X) x64
- obs-studio 二次封装 (四)obs 音视频采集到推流大体流程图
- 大学寒假这样过,过完惊艳所有人,不只是你的宿友,mysql基础教程西泽pdf
- ale插件 vim_vim ale插件详情
- 已知a和b的最大公因数和最小公倍数求这两个数字
- securecrt 不掉线_如何不掉线
- [笔记]-后端学习笔记