前言

在前文中,讲述了一个可靠信号的示例。它分成几个步骤组成( 请参考前文 )。在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便。

那就是调用 sigaction 函数。

sigaction() 函数

原型:int sigaction (int signo, const struct sigaction * restrict act, struct sigaction *restrict oact)

作用:将信号及其处理函数关联起来,但这个注册函数中,信号处理函数是放在一个结构体中的,这个结构体除了注册函数,还可以存放一些其他信息,以实现可靠信号机制:

其中,第一个字段是信号处理函数的地址;第二个字段是在接收到所等待的信号前,需要屏蔽的信号的信号集( 从信号处理函数返回之后就会恢复到原先的信号屏蔽字 );

另外两个字段一般设置为 0 和 NULL,用的比较少。

最后一个参数如果非空责将返回这个信号原本对应的的信号处理结构体。

代码实现

下面程序是一个使用 sigaction 函数实现可靠信号的示例:

 #include <stdio.h>
#include <unistd.h>
#include <signal.h> static void sig_quit (int); int main (void) { // 初始化信号处理结构体
struct sigaction act;
act.sa_handler = sig_quit;
// 这一步可以根据需要,屏蔽指定的信号,其对应信号处理函数执行完毕以后,信号屏蔽字又会恢复到调用前的状态。
sigemptyset (&act.sa_mask);
act.sa_flags = ;
act.sa_sigaction = NULL; // 记得参数类型是引用类型!
if (sigaction (SIGQUIT, &act, NULL) < ) {
printf ("注册信号处理函数失败\n");
return ;
} // 在此阶段进入信号处理函数并返回后,不会继续挂起状态,而是进入到下一条语句。
sleep (); return ;
} static void sig_quit (int signo)
{
printf("捕捉到退出信号\n"); // 将对退出信号的处理设置为关闭进程
if (signal (SIGQUIT, SIG_DFL) == SIG_ERR) {
printf("设置退出信号处理函数失败\n");
}
}

运行测试

       发现了一个问题:未打印” 捕捉到退出信号\n " ( 31 行 ),这个问题只能留待日后解决。

小结

sigaction 结构体的后两个参数的具体功能,请参阅相关资料。

第二十五篇:使用 sigaction 函数实现可靠信号的更多相关文章

  1. 使用 sigaction 函数实现可靠信号

    前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便.那就是调用 sigaction ...

  2. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

  3. 第二十五篇:在SOUI中做事件分发处理

    不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...

  4. 第二十五篇 jQuery 学习7 获取并设置 CSS 类

    jQuery 学习7 获取并设置 CSS 类   jQuery动态控制页面,那么什么是动态呢?我们就说一下静态,静态几乎又纯html+css完成,就是刷新页面之后,不会再出现什么变动,一个实打实的静态 ...

  5. 第二十五篇 -- C++宝典中的图书管理系统

    此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...

  6. flask第二十五篇——控制语句

    有兴趣的请加船长公众号:自动化测试实战 先和大家强调一个发邮件的问题 # coding: utf-8 import smtplib from email.mime.text import MIMETe ...

  7. SpringBoot非官方教程 | 第二十五篇:2小时学会springboot

    转载请标明出处: http://blog.csdn.net/forezp/article/details/61472783 本文出自方志朋的博客 一.什么是spring boot Takes an o ...

  8. 第二十五篇 -- QTreeWidget右击菜单的实现

    效果图: 自己画一个ui,如图,前面已经讲过怎么用Qt Designer画图了,现在就不赘述了. ui_play.py # -*- coding: utf-8 -*- # Form implement ...

  9. 第二十五篇-Android 应用资源

    这里介绍android的一些资源文件. 以一个登录界面为例. layout.xml <?xml version="1.0" encoding="utf-8" ...

随机推荐

  1. js表单验证控制代码大全

    http://www.cnblogs.com/SAL2928/archive/2008/10/24/1319020.html目录: 1:js 字符串长度限制.判断字符长度.js限制输入.限制不能输入. ...

  2. springboot 1.5.10 +kotlin 1.2.20 解决 java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalError

    使用http://start.spring.io/ 下载的 项目 跑单元测试 报 java.lang.ClassNotFoundException: kotlin.reflect.KotlinRefl ...

  3. unity, access material

    MeshRenderer meshRenderer=gameObject.GetComponent<MeshRenderer>();                if(meshRende ...

  4. Confluence - Online Team Collaboration Tool

    Confluence - 在线的团队协作沟通工具,包含 meeting 管理, wiki 等等功能 https://www.atlassian.com/software/confluence

  5. vim资源帖

    vimscript教程 http://learnvimscriptthehardway.stevelosh.com/ 阿信的vimscript http://www.axiaoxin.com/arti ...

  6. linux Find命令教程

    find的语法: find [起始目录] 寻找条件 操作 还有种表述方式:find PATH OPTION [-exec COMMAND { } \;] 因为find命令会根据我们给的option,也 ...

  7. Windows下ADB默认的5037port被占用,解决方式。

    Windows下可能会因为系统版本号不一样的原因导致有的系统5037port被系统进程占用.导致ADB无法使用5037port,从而导致ADB不能打开.在eclipse上跑Android程序的时候显示 ...

  8. swift 单例模式

    class ca{ ; static var instance:ca = ca(); class func GetInstance()->ca{ return instance; } } var ...

  9. 0067 MySQL的日期字段的取值用单引号

    这两天在做sql练习题http://www.cnblogs.com/zxx193/p/4000467.html的时候,涉及到下面的建表+插数据操作 CREATE TABLE t1( s_no VARC ...

  10. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...