UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
lienhua34
2014-11-05
sigaction 函数跟 signal 函数一样,用于设置信号处理函数。此函数是用于取代 UNIX 早期版本使用的 signal 函数。UNIX 早期版本的 signal 函数在捕获到一个信号之后,就会自动将该信号的处理动作恢复为默认处理动作。于是,如果我们希望注册的信号处理函数长期生效,则需要在信号处理程序中再次调用 signal 函数注册一次。这样的操作太麻烦,而且在信号处理函数中再次调用 signal 注册信号处理函数之前可能又会产生该信号,而这个信号就会触发默认处理动作。
另外,signal 函数还有一个限制:不修改信号的处理方式就不能确定该信号的当前处理方式。这个限制在 sigaction 函数中不存在。
sigaction 函数的声明如下,
#include <signal.h>
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
返回值:若成功则返回0,若出错则返回-1
其中,signo 参数即要检测或修改其处理动作的信号编号。如果 act 指针非空,则要修改该信号的处理动作。如果 oact 指针非空,则由 oact 指针返回该信号的上一个动作。
sigaction 函数的参数中使用的结构体 struct sigaction 的声明如下,
struct sigaction {void (*sa_handler)(int);sigset_t sa_mask;int sa_flags;void (*sa_sigaction)(int, siginfo_t *, void *); };
该结构体各个字段的说明如下:
- sa_handler:信号处理函数的指针。
- sa_mask:在调用该信号的处理函数期间进程要阻塞的信号集。
- sa_flags:指定信号进行处理的各个选项,关于具体的选项,可以参考sigaction 函数的手册。
- sa_sigaction:替代的信号处理函数,如果sa_flags 设置了SA_SIGINFO,则会调用该信号处理函数;否则调用sa_handler。
我们来看一个例子,
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <signal.h>void print_mask(const char *str) {sigset_t sigset;int errno_save;errno_save = errno;if (sigprocmask(0, NULL, &sigset) < 0) {printf("sigprocmask error: %s\n", strerror(errno));exit(-1);}printf("%s", str);if (sigismember(&sigset, SIGALRM)) {printf("SIGALRM ");}if (sigismember(&sigset, SIGINT)) {printf("SIGINT ");}printf("\n");errno = errno_save; }static void sig_alrm(int signo) {printf("received SIGALRM\n");print_mask("in sig_alrm: "); }int main(void) {struct sigaction sact;sact.sa_handler = sig_alrm;sact.sa_flags = 0;sigemptyset(&sact.sa_mask);sigaddset(&sact.sa_mask, SIGINT);if (sigaction(SIGALRM, &sact, NULL) < 0) {printf("sigaction error: %s\n", strerror(errno));exit(-1);}print_mask("in main before alarm: ");alarm(3);pause();print_mask("in main after alarm: ");exit(0); }
在上面的 sigactiondemo.c 程序中,我们调用 sigaction 函数设置了信号 SIGALRM 的处理函数,而在 sigaction 函数的参数 act 的sa_mask 字段中添加了信号 SIGINT,表示调用信号 SIGALRM 的处理函数期间,进程阻塞信号 SIGINT。编译该程序,生成并执行可执行文件 sigactiondemo,
lienhua34:demo$ gcc -o sigactiondemo sigactiondemo.c lienhua34:demo$ ./sigactiondemo in main before alarm: received SIGALRM in sig_alrm: SIGALRM SIGINT in main after alarm:
从上面的运行结果,我们看到在 SIGALRM 信号产生之前,进程没有屏蔽信号 SIGINT 和 SIGALRM,而在信号 SIGALRM 的处理函数中,进程的信号屏蔽字中包含了 SIGINT 和 SIGALRM,而在调用 SIGALRM 的信号处理函数之后,进程的信号屏蔽字复原为调用信号处理屏蔽字之前。(说明:在调用 sigaction 函数注册的信号处理函数期间,系统会自动将该信号也加入信号屏蔽字中,除非设置 sigaction 函数的 act 参数的sa_flags为SA_NODEFER。)
(done)
转载于:https://www.cnblogs.com/lienhua34/p/4077595.html
UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数相关推荐
- Unix环境编程中的apue.h和err_quit、err_sys问题
现在开始学习<Unix环境编程>这本书,在学习的时候总会遇到书中的程序编译时会出现问题.所以自己将遇到的问题及解决的方法进行总结. 找不到头文件apue.h和err_qiut.err_sy ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
- Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作
Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...
- UNIX环境编程(c语言)--套接字--基本TCP套接字编程
目录 准备知识 字节序 字节序转换函数 字节操纵函数 地址转换函数 地址结构 基本TCP套接字编程 概要 socket函数 bind函数 listen函数 accept函数 connect函数 通信函 ...
- Hadoop学习笔记—16.Pig框架学习
Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...
- 【初阶】unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流...
[初阶]unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流 一.关于 显示分数时,如何让函数之间相互交流 这是一个非常好的逻辑问题 1 思路:主 ...
- Hadoop学习笔记—18.Sqoop框架学习
Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...
- 学习笔记之——基于深度学习的图像超分辨率重建
最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...
- 梅科尔工作室-Django学习笔记(二次学习)(3)
本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...
最新文章
- 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
- [世界杯]世界杯的哲学思想
- C语言中float double等类型在内存中的存储
- 数据结构——进制转换(10—n)
- [转载]spring使用PropertyPlaceholderConfigurer加载properties文件处理中文乱码
- 关于多维数组编码与解码的问题
- 病毒行为分析初探(二)
- UGUI动态改变MatchWidthOrHeight
- 26个数据分析案例——第三站:基于python的药店销售数据分析
- 华为交换机修改radius服务器地址,华为交换机radius认证-组网配置:pc+华为三层交换机+radius服务器(2003系统),求radius服务器的配置...
- 图片裁剪cropper 示例
- 关于在新办纳税人中实行增值税专用发票电子化有关事项的公告
- mysql perl教程_使用 Perl 的 MySQL 事务
- 如何增加你的被动收入
- Markdown合并表格单元格
- android中接口的作用是什么意思,详解Android接口Interface的使用和意义
- 来自帅气博主的c语言文案
- oracle中minus什么意思,Oracle Minus关键字
- qt_cannot find -lxxx, 链接动态/静态库失败
- layui进入页面就执行事件
热门文章
- Windows 8.1 新增控件之 DatePicker
- vim为何打开文件乱码,而且之后setenc还是乱码?附带实用vimrc一份
- SqlCommandBuilder
- Android7.1的EDP屏替换
- MySQL(7)数据库中的高级(进阶)语句:VIEW视图、联集和常见计算
- python从字典里搜索_Python:在字典中搜索字典的函数
- python心理学实验程序_psychopy coder模式编写心理试验程序 字符程序和记录反应时...
- 万物智联时代的终端智能「管家」重磅升级:混合云IoT一体机
- Flink 助力美团数仓增量生产的应用实践
- 宜泊科技阿里云,加速智慧停车产业数字化发展