sigaction 用法实例
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
intsigaction(int signo,conststruct sigaction*restrict act, struct sigaction*restrict oact); |
结构sigaction定义如下:
structsigaction{ |
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_NODEFER: 当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。 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 用法实例的更多相关文章
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- 上传文件及$_FILES的用法实例
Session变量($_SESSION):�php的SESSION函数产生的数据,都以超全局变量的方式,存放在$_SESSION变量中.1.Session简介SESSION也称为会话期,其是存储在服务 ...
- C++语言中cin cin.getline cin.get getline gets getchar 的用法实例
#include <iostream> #include <string> using namespace std; //关于cin cin.getline cin.get g ...
- Union all的用法实例sql
---Union all的用法实例sqlSELECT TOP (100) PERCENT ID, bid_user_id, UserName, amount, createtime, borrowTy ...
- 【转】javascript入门系列演示·三种弹出对话框的用法实例
对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...
- php strpos 用法实例教程
定义和用法该strpos ( )函数返回的立场,首次出现了一系列内部其他字串. 如果字符串是没有发现,此功能返回FALSE . 语法 strpos(string,find,start) Paramet ...
- 【JSP】三种弹出对话框的用法实例
对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- jQuery中on()方法用法实例详解
这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能及各种常见的使用技巧,并对比分析了与bind(),live(),delegate()等方法的区别,需要的朋友可以参考下 本 ...
随机推荐
- HDU 2639 Bone Collector II(01背包变型)
此题就是在01背包问题的基础上求所能获得的第K大的价值. 详细做法是加一维去推当前背包容量第0到K个价值,而这些价值则是由dp[j-w[ i ] ][0到k]和dp[ j ][0到k]得到的,事实上就 ...
- SQL优化(Oracle)
(转)SQL优化原则 一.问题的提出 在应用系统开发初期.因为开发数据库数据比較少.对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,可是假设将应用系统提交实际应用后,随着数 ...
- TinyXml 快速入门(三)
在<TinyXml 快速入门(二)>介绍使用tinyxml库获取xml文件声明,查询指定节点.删除指定节点的做法.在本文中继续介绍修改指定节点和增加节点的做法. 修改节点其实和查询指定节点 ...
- iTerm2和oh-my-zsh的个性化定制
终于在某东做活动新入手了一台air,看身边小伙伴的mac的终端感觉好炫酷,于是乎准备自己也捯饬捯饬,google了一下,发现了osx平台上的终端神器iTerm2和用来代替bash的oh-my-zsh, ...
- VS2013配置文件常见问题解决方法
1.C++ VS2013出现LINK : fatal error LNK1104: 无法打开文件“kernel32.lib,”错误,什么原因啊?原因:项目->XX(项目名称)属性->链接器 ...
- spring05配置文件之间的关系
一:配置文件包含关系 1.创建对应的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; ...
- css05文本,文字属性
1.创建一个html页面 <!DOCTYPE html> <html> <head lang="en"> <meta charset=&q ...
- nyoj 76
#include <iostream> using namespace std; int main() { int i,t,n; int a[101]; cin>>t; whi ...
- Jquery插件-Html5图片上传并裁剪
/** * 图片裁剪 * @author yanglizhe * 2015/11/16 */ (function($){ /** * Drag */ var Drag={obj:null,init:f ...
- Visual Studio2015 Community一些必备插件
Visual Studio2015 Community一些必备插件 是不是感觉虽然VS2015的代码编辑能力已经很强大了,但是总感觉差了那么一些呢?不用担心,它有很多非常强大的插件,能够让你打代码事半 ...