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

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

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

intsigaction(int signo,conststruct sigaction*restrict act,

struct sigaction*restrict oact);

结构sigaction定义如下:

structsigaction{
  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_NODEFER:  当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。
SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数。

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

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

使用示例为:

#include <stdio.h>
#include <signal.h>void WrkProcess(int nsig)
{printf("WrkProcess .I get signal.%d threadid:%d/n",nsig,pthread_self());int i=0;while(i<5){printf("%d/n",i);sleep(1);i++;}
}int main()
{struct sigaction act,oldact;act.sa_handler  = WrkProcess;
//      sigaddset(&act.sa_mask,SIGQUIT);
//      sigaddset(&act.sa_mask,SIGTERM)act.sa_flags = SA_NODEFER | SA_RESETHAND;
//        act.sa_flags = 0;sigaction(SIGINT,&act,&oldact);printf("main threadid:%d/n",pthread_self());while(1)sleep(5);return 0;
}

1)执行改程序时,ctrl+c,第一次不会导致程序的结束。而是继续执行,当用户再次执行ctrl+c的时候,程序采用结束。

2)如果对程序稍微进行一下改动,则会出现另外一种情况。

改动为:act.sa_flags = SA_NODEFER;

经过这种改变之后,无论对ctrl+d操作多少次,程序都不会结束。

3)下面如果再对程序进行一次改动,则会出现第三种情况。

For example:  act.sa_flags = 0;

在执行信号处理函数这段期间,多次操作ctrl+c,程序也不会调用信号处理函数,而是在本次信号处理函数完成之后,在执行一次信号处理函数(无论前面产生了多少次ctrl+c信号)。

如果在2)执行信号处理函数的过程中,再次给予ctrl+c信号的时候,会导致再次调用信号处理函数。

4)如果在程序中设置了sigaddset(&act.sa_mask,SIGQUIT);程序在执行信号处理函数的过程中,发送ctrl+/信号,程序也不会已经退出,而是在信号处理函数执行完毕之后才会执行SIGQUIT的信号处理函数,然后程序退出。如果不添加这项设置,则程序将会在接收到ctrl+/信号后马上执行退出,无论是否在ctrl+c的信号处理函数过程中。

原因如下:

1)情况下,第一次产生ctrl+c信号的时候,该信号被自己设定的信号处理函数进行了处理。在处理过程中,由于我们设定了SA_RESETHAND标志位,又将该信号的处理函数设置为默认的信号处理函数(系统默认的处理方式为IGN),所以在第二次发送ctrl+d信号的时候,是由默认的信号处理函数处理的,导致程序结束;

2)情况下,我们去掉了SA_RESETHAND了标志位,导致程序中所有的ctrl+d信号均是由我们自己的信号处理函数来进行了处理,所以我们发送多少次ctrl+c信号程序都不会退出;

3)情况下,我们去掉了SA_NODEFER标志位。程序在执行信号处理函数过程中,ctrl+c信号将会被阻止,但是在执行信号处理函数期发送的ctrl+c信号将会被阻塞,知道信号处理函数执行完成,才有机会处理信号函数执行期间产生的ctrl+c,但是在信号函数执行产生的多次ctrl+c,最后只会产生ctrl+c。2)情况下,由于设置了SA_NODEF,ctrl+c信号将不会被阻塞。所以能够并行执行下次的信号处理函数。

4)情况下,我们是设置了在执行信号处理函数过程中,我们将屏蔽该信号,当屏蔽该信号的处理函数执行完毕后才会进行处理该信号。

附:

当我们按下ctrl+c的时候,操作为:向系统发送SIGINT信号,SIGINT信号的默认处理,退出程序。

当我们按下ctrl+/的时候,操作为:向系统发送SIGQUIT信号,该信号的默认处理为退出程序。

FROM:  http://blog.csdn.net/jiang1013nan/article/details/5409684

参考: sigaction函数解析

http://blog.chinaunix.net/uid-1877180-id-3011232.html

sigaction 用法实例相关推荐

  1. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  2. php中 datalist,html5 datalist标签的用法是什么?这里有datalist标签的用法实例

    本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例.本文说了两个常用的选项框的实例供大家选择观看,下面就让我们一起来看这篇文章吧 我们先来看 ...

  3. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

  4. CStopWatch计时器的用法实例

    CStopWatch计时器的用法实例 创建CStopWatch对象: CStopWatch m_runningtimeWatch; //定义一个计时器 定义一个装返回值的变量: double m_ru ...

  5. Go语言MD5加密用法实例

    Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (     "crypto/md5" ...

  6. python mysqldb cursor_python中MySQLdb模块用法实例

    转载自:http://www.jb51.net/article/57290.htm 姓名:梅金波                        学号:16010110036 [嵌牛导读]MySQLdb ...

  7. input type=range标签用法实例代码

    在HTML5中,又新增许多新<input>控件类型,比较实用的一个就是<input type="range">,以滑竿的方式来调整value值,在这以前需要 ...

  8. Union all的用法实例sql

    ---Union all的用法实例sql SELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowT ...

  9. cube、rollup及exec的用法实例

    为什么80%的码农都做不了架构师?>>>    cube.rollup及exec的用法实例 select sdept 系部,sno 学号,max(sage) 最大年龄,   grou ...

最新文章

  1. Linux 系统挂载数据盘
  2. golang中的Session支持
  3. 用aspiration造句_aspiration
  4. POJ 1088(滑雪)
  5. Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)
  6. 少儿编程150讲轻松学Scratch(十一)-用Scratch巧解数学题——判定质数
  7. 你真的了解Java系统启动流程吗?mysql不包含多个字符
  8. iOS5中 UIViewController新方法的使用
  9. 巴塞尔大学合作项目博士招生,医学图像分析领域
  10. linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
  11. Tensorflow实现VGG网络
  12. openpyxl使用
  13. sklearn 相似度矩阵_利用sklearn计算文本相似性
  14. React生命周期钩子函数
  15. 频繁默认网关不可用_Win10经常断网提示默认网关不可用的解决方法
  16. 【DNS应用案例】智能DNS赋能海运集团全球域名体系建设
  17. auto-cpufreq安装及配置过程
  18. OSChina 周三乱弹 —— 程序员的专属小习惯
  19. 深度学习高手该怎样炼成?这位拿下阿里天池大赛冠军的中科院博士为你规划了一份专业成长路径
  20. 使用 Abp.Zero 搭建第三方登录模块(一):原理篇

热门文章

  1. word中标题黑色实心框删除
  2. 真正解决 PowerPoint 2007 中不能输入汉字问题
  3. MySQL的binlog和redo log
  4. IDC边缘云市场报告发布,网心科技位居中国边缘公有云第一梯队!
  5. 《SpringBoot篇》12.@Valid与@Validated的区别
  6. offsetTop、offsetLeft、offsetWidth、offsetHeight
  7. ROG幻X领衔 ROG 2022全线笔记本硬核升级
  8. putty连接Window并使用
  9. VRJam 推出用于虚拟音乐会和现场直播的Web3场地
  10. centos 6.7安装mysql_Linux(CentOS6.7) 安装MySql5.7数据库