前言

在前文中,讲述了一个可靠信号的示例。它分成几个步骤组成( 请参考前文 )。在 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. vmware-Binary translation is incompatible with long mode on this platform

    解决方法:Binary translation is incompatible with long mode on this platform. Disabling long mode. Withou ...

  2. Android实现开机自动运行程序

    有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call y ...

  3. IntelliJ IDEA 学习(二):Intellij IDEA 创建Web项目并在Tomcat中部署运行IDEA

    一.创建Web项目  1.File -> New Module,进入创建项目窗口 2.选择Java类型,在 Module name 处输入项目名,点击Next 3.勾选 Web Applicat ...

  4. SQLyog之MySQL客户端的下载、安装和使用(企业版)(破解)

    本博文的主要内容有 .SQLyog的下载 .SQLyog的安装 .SQLyog的使用 1.SQLyog_Enterprise的下载 比如,我这里,是放在D:\SoftWare 继续

  5. Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

    这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ...

  6. Ubuntu下安装java

    1.首先到java.com下载最新版本的jdk.下面是jdk8的网址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  7. form表单回车Enter不直接提交,类似tab切换

    <input> 控件增加onkeypress事件 onkeypress="return handleEnter(this, event)" JS如下: var keyC ...

  8. Spring学习11-Spring使用proxool连接池 管理数据源

    Spring 一.Proxool连接池简介及其配置属性概述   Proxool是一种Java数据库连接池技术.是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是 ...

  9. CentOS 7.0 关闭firewalld防火墙指令 及更换Iptables防火墙

    CentOS 7.0 关闭firewalld防火墙指令 及更换Iptables防火墙 时间:2014-10-13 19:03:48  作者:哎丫丫  来源:哎丫丫数码网  查看:11761  评论:2 ...

  10. ubuntu 16.04 安装 ITDB

    其实标题本不应该是这个 之前也部署过itdb,这款软件本身不必多言,来自希腊的精品.最近因为单位需要,又要重新部署.前几年部署itdb的时候用的是ub14,但目前最新的是ub16,于是就部署呗.但在后 ...