sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。

他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)

给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact

int sigaction(int signo,const struct sigaction *restrict act,

              struct sigaction *restrict oact);

结构sigaction定义如下:

struct sigaction{
  void (*sa_handler)(int);
   sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler字段包含一个信号捕捉函数的地址

sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。

sa_flag是一个选项,主要理解两个

SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启

SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针

最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。

例子:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void show_handler(int sig)
{
    printf("I got signal %d\n", sig);
    int i;
    for(i = 0; i < 5; i++) {
        printf("i = %d\n", i);
        sleep(1);
    }
}

int main(void)
{
    int i = 0;
    struct sigaction act, oldact;
    act.sa_handler = show_handler;
    sigaddset(&act.sa_mask, SIGQUIT); //见注(1)
    act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2)
    //act.sa_flags = 0; //见注(3)

sigaction(SIGINT, &act, &oldact);
    while(1) {
        sleep(1);
        printf("sleeping %d\n", i);
        i++;
    }
}

注:
(1)    如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。

(2)    SA_NODEFER       一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)   
       SA_RESETHAND    当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)

(3)    如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失!

sigaction函数相关推荐

  1. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数

    第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...

  2. sigaction函数解析

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

  3. UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数

    lienhua34 2014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 ...

  4. sigaction函数使用实例

    sigaction函数 (1)sigaction函数原型 sigaction函数用来查询和设置信号处理方式,它是用来替换早期的signal函数.sigaction函数原型及说明如下: sigactio ...

  5. Linux 进程学习(四)------ sigaction 函数

    转自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数:  signal 函数的使用方法 ...

  6. 信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  7. 信号、signal 函数、sigaction 函数

    文章目录 1.信号的基本概念 2.利用 kill 命令发送信号 3.信号处理的相关动作 4.信号与 signal 函数 4.1 signal 函数示例一 4.2 signal 函数示例二 5.利用 s ...

  8. 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  9. sigaction函数中关于sa_mask的解释

    使用 man sigaction 查看手册,对sa_mask的描述是这样的: sa_mask  specifies  a  mask  of  signals which should be bloc ...

  10. linux sigaction函数 sa_flags的值

    开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include <stdio.h>   2 #include <stdlib.h>   3 ...

最新文章

  1. 迪士尼公布最新研究:AR对象可智能地与环境中的物体交互
  2. matlab中fill函数的使用方法
  3. 学生信息管理系统c语言课设,学生信息管理系统C语言课设.doc
  4. 计算机网络设备配置遇到的问题,网络设备使用与维护
  5. python的urllib2包基本使用方法
  6. 【NOI OpenJudge】【1.4】编程基础之逻辑表达式与条件分支
  7. php 中文名称排序 源码,四种排序算法PHP实现类
  8. Ubuntu 18.04 8T硬盘挂载
  9. 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)
  10. [2020 年百度之星·程序设计大赛 - 复赛] Battle for Wosneth
  11. 浙大计算机考研分数线2016,浙江大学2016考研复试分数线
  12. Windows下利用Python自动切换IP/DNS
  13. 见微知著:语义分割中的弱监督学习
  14. CuraEngine引擎命令行调用方法
  15. java中的char_java中的char是什么意思?
  16. 2022年Github学生包白嫖!
  17. Tableau权限设置
  18. 机器学习典型隐私威胁
  19. 随机生成双色球号码判断中奖模拟开奖python代码
  20. 如何提高系统的稳定性?

热门文章

  1. 学生成绩表c语言,学生成绩管理系统C语言(附完整源代码) .doc
  2. ShineScrum10月27日高端敏捷沙龙火热报名
  3. 计算机错误1053,系统之家win7电脑宽带连接失败提示错误1053怎么办
  4. 以报复为由,新版本Conti勒索软件源代码遭泄露,6万余条内部消息公之于众
  5. 云栖小镇通勤车_云栖大会来啦!云栖小镇怎么走 杭州交警告诉你
  6. lightdb22.3预览-listagg 增强
  7. 雅可比法实验报告matlab,数学建模实验报告范文 数学建模的实验报告
  8. 【z3 solver手动安装】
  9. 普通心理学-学习笔记
  10. DCL(双锁检测)单例模式