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 函数相关推荐

  1. Unix环境编程中的apue.h和err_quit、err_sys问题

    现在开始学习<Unix环境编程>这本书,在学习的时候总会遇到书中的程序编译时会出现问题.所以自己将遇到的问题及解决的方法进行总结. 找不到头文件apue.h和err_qiut.err_sy ...

  2. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  3. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  4. Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作

    Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...

  5. UNIX环境编程(c语言)--套接字--基本TCP套接字编程

    目录 准备知识 字节序 字节序转换函数 字节操纵函数 地址转换函数 地址结构 基本TCP套接字编程 概要 socket函数 bind函数 listen函数 accept函数 connect函数 通信函 ...

  6. Hadoop学习笔记—16.Pig框架学习

    Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...

  7. 【初阶】unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流...

    [初阶]unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流 一.关于 显示分数时,如何让函数之间相互交流 这是一个非常好的逻辑问题 1 思路:主 ...

  8. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  9. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  10. 梅科尔工作室-Django学习笔记(二次学习)(3)

    本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...

最新文章

  1. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
  2. [世界杯]世界杯的哲学思想
  3. C语言中float double等类型在内存中的存储
  4. 数据结构——进制转换(10—n)
  5. [转载]spring使用PropertyPlaceholderConfigurer加载properties文件处理中文乱码
  6. 关于多维数组编码与解码的问题
  7. 病毒行为分析初探(二)
  8. UGUI动态改变MatchWidthOrHeight
  9. 26个数据分析案例——第三站:基于python的药店销售数据分析
  10. 华为交换机修改radius服务器地址,华为交换机radius认证-组网配置:pc+华为三层交换机+radius服务器(2003系统),求radius服务器的配置...
  11. 图片裁剪cropper 示例
  12. 关于在新办纳税人中实行增值税专用发票电子化有关事项的公告
  13. mysql perl教程_使用 Perl 的 MySQL 事务
  14. 如何增加你的被动收入
  15. Markdown合并表格单元格
  16. android中接口的作用是什么意思,详解Android接口Interface的使用和意义
  17. 来自帅气博主的c语言文案
  18. oracle中minus什么意思,Oracle Minus关键字
  19. qt_cannot find -lxxx, 链接动态/静态库失败
  20. layui进入页面就执行事件

热门文章

  1. Windows 8.1 新增控件之 DatePicker
  2. vim为何打开文件乱码,而且之后setenc还是乱码?附带实用vimrc一份
  3. SqlCommandBuilder
  4. Android7.1的EDP屏替换
  5. MySQL(7)数据库中的高级(进阶)语句:VIEW视图、联集和常见计算
  6. python从字典里搜索_Python:在字典中搜索字典的函数
  7. python心理学实验程序_psychopy coder模式编写心理试验程序 字符程序和记录反应时...
  8. 万物智联时代的终端智能「管家」重磅升级:混合云IoT一体机
  9. Flink 助力美团数仓增量生产的应用实践
  10. 宜泊科技阿里云,加速智慧停车产业数字化发展