前言

  在前文中,讲述了一个可靠信号的示例。它分成几个步骤组成( 请参考前文 )。在 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. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

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

  3. 使用sigaction函数

    sigaction函数 修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数) :失败:-1,设置errno 参数: act:传入参数,新的处理方式.oldact:传出参数,旧的处理方式. ...

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

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

  5. 信号处理signal、sigaction、pause、信号嵌套处理、不可重入函数

    信号的捕捉和处理 主要由signal和sigaction函数来完成.还有一个函数pause,它可用来响应任何信号,不过不做任何处理. 1.signal函数 typedef void (*sighand ...

  6. 信号的捕捉与sigaction函数

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

  7. Linux 信号(三)—— sigaction 函数

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 #include <signal.h> int sigaction(int signo, con ...

  8. 信号之sigaction函数

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(或同时执行这两种操作). #include <signal.h> int sigaction( int signo, c ...

  9. linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction

    一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...

随机推荐

  1. linux tomcat安装(二)

    安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.69.tar.gz(官方网址:http://tomcat.apache.org/) 2.解压 Tomcat 解压 apac ...

  2. django前端渲染多对多关系(比如一本书的作者有哪些)

    自己遇到的问题是,前端渲染不出多对多关系,咨询Yuan后解决,特此记录. urls.py from django.conf.urls import url from book import views ...

  3. SpringBoot重点详解--使用Junit进行单元测试

    目录 添加依赖与配置 ApplicationContext测试 Environment测试 MockBean测试 Controller测试 情况一 情况二 方法一 方法二 本文将对在Springboo ...

  4. hdu 2078(DFS)

    Matrix Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3845   Accepted: 1993 Descriptio ...

  5. hdu 2841(容斥原理+状态压缩)

    Visible Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. 数据库SQL Server 2014 设置自动备份(维护计划和作业)

    前言     1.SQL Server数据库自动备份可以有两种操作          第一种是在SQL控制台下的服务器名称展开,展开“管理”--选择“维护计划”,右键“新建维护计划”即可.       ...

  7. chartcontrol(统计坐标图形控件)

    统计图形 把控件拖放到界面会弹出下图 图形共分八系列:Bar Series,Point and line Series,pie Series,Funnel Series,Area  Series,Ra ...

  8. Codeforces 490F Treeland Tour(离散化 + 线段树合并)

    题目链接 Treeland Tour 题目就是让你求树上LIS 先离散化,然后再线段树上操作.一些细节需要注意一下. #include <bits/stdc++.h> using name ...

  9. spring的自动装配Bean与自动检测Bean

    spring可以通过编写XML来配置Bean,也可以通过使用spring的注解来装配Bean. 1.自动装配与自动检测: 自动装配:让spring自动识别如何装配bean的依赖关系,减少对<pr ...

  10. 1007 Maximum Subsequence Sum

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...