1. 阻塞,sigaction函数有阻塞的功能,比如SIGINT信号来了,进入信号处理函数,默认情况下,在信号处理函数未完成之前,如果又来了一个SIGINT信号,其将被阻塞,只有信号处理函数处理完毕,才会对后来的SIGINT再进行处理,同时后续无论来多少个SIGINT,仅处理一个SIGINT,sigaction会对后续SIGINT进行排队合并处理。

2. sa_mask,信号屏蔽集,可以通过函数sigemptyset/sigaddset等来清空和增加需要屏蔽的信号,上面代码中,对信号SIGINT处理时,如果来信号SIGQUIT,其将被屏蔽,但是如果在处理SIGQUIT,来了SIGINT,则首先处理SIGINT,然后接着处理SIGQUIT。

3. sa_flags如果取值为0,则表示默认行为。还可以取如下俩值,但是我没觉得这俩值有啥用。

  • SA_NODEFER,如果设置来该标志,则不进行当前处理信号到阻塞
  • SA_RESETHAND,如果设置来该标志,则处理完当前信号后,将信号处理函数设置为SIG_DFL行为
#include <signal.h>
#include <stdio.h>
#include <unistd.h>  void sig_handler(int sig) {
//    printf("receive : %d,thread id :%d", sig, pthread_self());fprintf(stdout,"receive : %d,thread id :%d\n", sig, pthread_self());int i = 0;while (i < 5) {fprintf(stdout,"%d\n", i);sleep(1);i++;}
}int main(int argc, char **argv) {struct sigaction sa;sa.sa_handler = sig_handler;sa.sa_flags = 0 ;sigaction(SIGINT, &sa, NULL);printf("current thread:%d\n",pthread_self());while (1){sleep(1);}return 0;
}
  1. 当sa.sa_flags = 0 时当第一次按crtl+c 进入信号函数,接着在信号函数处理期间按多次crtl+c将合并成一次调用。
  2. 当sa.sa_flags = SA_NODEFER时信号函数时并发重入的,即按多少次crtl+c就立即进入几次。
  3. sa.sa_flags = SA_RESETHAND时当一次执行信号函数期间按多次crtl+c是忽略的,第一次执行完后会设置为SIG_DFL即原始的crtl+c操作也就是退出。
  4. sa.sa_flags = SA_NODEFER|SA_RESETHAND第一次产生ctrl+c信号的时候,该信号被自己设定的信号处理函数进行了处理。在处理过程中,由于我们设定了SA_RESETHAND标志位,又将该信号的处理函数设置为默认的信号处理函数(系统默认的处理方式为INT),所以在第二次发送ctrl+c信号的时候,是由默认的信号处理函数处理的,导致程序结束。

所以线上的信号函数可以设置成如下安全退出程序:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>  void sig_handler(int sig) {app.stop();exit(0);
}int main(int argc, char **argv) {struct sigaction sa;sa.sa_handler = sig_handler;sa.sa_flags = 0 ;sigaction(SIGINT, &sa, NULL);sleep(100);return 0;
}

信号函数sigaction解析相关推荐

  1. 对信号函数sigaction的sa_mask的学习

    2019独角兽企业重金招聘Python工程师标准>>> #include "apue.h" static void sigparse1(int sig,sigin ...

  2. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  3. 信号发送函数sigqueue和信号安装函数sigaction

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

  4. 复指数与高斯函数乘积的傅里叶变换_希尔伯特变换:将实数信号变换成解析信号?节省带宽,提升效率...

    通信中的调制,我们可以看作为在频域范围内的频谱搬移技术. 对于一个原始信号m(t),我们加上一个直流分量A0,再乘以载波信号,就得到了调幅AM信号. AM信号,之前的文章介绍过. 模拟调制:我们为什么 ...

  5. 非常好的一篇对linux信号(signal)的解析

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  6. Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号

    文章目录 信号函数 信号集 统一事件源 网络编程相关信号 Linux 进程信号:信号的概念.生命周期.产生流程.阻塞 在半年前我写过一篇博客介绍了Linux中信号的概念以及处理流程,这次再来深入的讲一 ...

  7. 函数函数sigaction、signal

    函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigact ...

  8. Linux 信号signal\sigaction

    转发:作者,故事狗 https://www.jianshu.com/p/f445bfeea40a Linux 信号signal 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号.信 ...

  9. 非常好的一篇对linux信号(signal)的解析 (转载)

    Linux信号(signal) 机制分析 转载至:https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html [摘要]本文分析了Linux ...

最新文章

  1. 数据结构(字典,跳跃表)、使用场景(计数器、缓存、查找表、消息队列、会话缓存、分布式锁)、Redis 与 Memcached、 键的过期时间、数据淘汰策略、持久化(RDB、AOF)
  2. 前端学习(2440):axios处理文章数据
  3. 前端学习(2326):angular之用户输入数据
  4. 作为现代行业才有的程序员为何地位不高?
  5. 聚合,组合,继承的区别
  6. 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用
  7. sql 整改措施 注入_防止SQL注入的五种方法
  8. OpenGL编程指南随书代码在VisualStudio2019的运行方法
  9. vum安装mysql_CentOS安装MySQL的完整步骤
  10. Python实现毫秒级抢单,6翻了!
  11. apache kafka 简介
  12. vue项目中实现汉字转拼音缩写
  13. ASIC Design and C Model
  14. 找出数组中其中最大的数及其下标
  15. 19/7/22 一个由王者荣耀引发的“惨案”(.NET)
  16. 关键业务(mission-critical)系统
  17. csdn的博客专家:【前端领域新星创作者】认证成功了
  18. Mod Organizer下载教程
  19. Notepad++又作死,国产文本编辑器Notepad--发布,支持Win/Linux/Mac平台
  20. 网易云课堂人工智能数学基础

热门文章

  1. 雅思备考Road to IELTS
  2. android灰色滤镜布局
  3. 从Nginx优秀的核心架构设计,揭秘其为何能支持高并发
  4. MYSQL卸载方法与安装方法
  5. PPT2007无法输入中文
  6. C语言的memcpy和memmove
  7. canvas 2d 贴图技术实践
  8. 现在手里有20万,想投资或者做生意,大家有什么好的建议吗?
  9. 关于js里面表单disabled属性使用
  10. 神策数据java开发工程师校招面经