因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生core的情况,今天我花了时间看了一些关于linux信号处理的博客。

总结一下:(知识未经实践)

  linux信号分两种,一种实时信号(也叫可靠信号),一种非实时信号(也叫不可靠信号)。
实时信号之所以是可靠的,因为在进程阻塞该信号的时间内,发给该进程的所有实时信号会排队,而非实时信号则会合并为一个信号。(可以这样理解,同一个不可靠信号同时产生时,只有一个信号会被处理,其它的丢弃)
早期设计的信号都是不可靠的,我们常见的SIGUSR1、SIGCHILD、SIGINT只有SIGRTMIN(信号值为34)以后的信号才是可靠的。
因此,当我们收到多个子进程同时退出的SIGCHLD信号时,最好循环调用waitpid,直到确认所以子进程退出已被处理,否则可能导致某些子进程成为僵尸进程
信号是可以忽略、捕获或阻塞的,但SIGSTOP和SIGKILL都是不可忽略、捕获或阻塞的信号。另外有一些错误信号是不可阻塞的,如SIGFPE、SIGILL、SIGSEGV、SIGBUS。
信号捕获处理有两种方式,一种是异步处理,另一种也是异步处理。(开玩笑的,另一种是同步处理)我们比较常用的是异步处理方式,即:注册一个信号处理函数,在信号发生时由内核调用。
异步处理方法需要注意注册的信号处理函数要尽量短,并且不可以调用非可重入函数(如printf、malloc、大多数使用使用了全局或静态数据结构的函数)。
注意非可重入函数并非线程安全函数,两者概念不一样。一般线程安全函数都是通过使用锁来达到线程安全的,但如果在信号处理函数里面这样做,很容易导致死锁。(当获取锁之后,未释放之前又发生信号函数调用即会出现)
如果你处理某个信号里需要消耗比较长的时间,一种推荐的处理方式是在消息处理函数将该信号登记到某个处理队列后立即返回,在主进程函数里面顺序处理。
接上,在c语言里面,可以在信号函数里面,使用write函数将信号值写入一个管道。管道另一端使用select监听处理。具体可以参考libevent
信号是线程级的,你可以使用pthread_kill向特定某个线程发送信号。如果你使用kill函数往某个进程发送信号,内核会随机将信号发给一个未阻塞该信号的线程处理。
在多线程应用中,我们需要使用sigaction来代替singal函数,并且可以使用pthread_sigmask来为每个线程设置独立的信号掩码。
多线程应用中,有一种同步处理信号的方式:开辟一个线程专门负责处理信号,其它线程把信号都屏蔽掉。信号处理线程循环调用sigwait等待信号到来并处理。

(直接粘贴文字变成一行,所以使用插入代码的方式)

14 Linux支持的信号列表如下。很多信号是与机器的体系结构相关的

信号值 默认处理动作 发出信号的原因

SIGHUP 1 A 终端挂起或者控制进程终止

SIGINT 2 A 键盘中断(如break键被按下)

SIGQUIT 3 C 键盘的退出键被按下

SIGILL 4 C 非法指令

SIGABRT 6 C 由abort(3)发出的退出指令

SIGFPE 8 C 浮点异常

SIGKILL 9 AEF Kill信号

SIGSEGV 11 C 无效的内存引用

SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道

SIGALRM 14 A 由alarm(2)发出的信号

SIGTERM 15 A 终止信号

SIGUSR1 30,10,16 A 用户自定义信号1

SIGUSR2 31,12,17 A 用户自定义信号2

SIGCHLD 20,17,18 B 子进程结束信号

SIGCONT 19,18,25 进程继续(曾被停止的进程)

SIGSTOP 17,19,23 DEF 终止进程

SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键

SIGTTIN 21,21,26 D 后台进程企图从控制终端读

SIGTTOU 22,22,27 D 后台进程企图从控制终端写

处理动作一项中的字母含义如下

A 缺省的动作是终止进程

B 缺省的动作是忽略此信号,将该信号丢弃,不做处理

C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。

D 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)

E 信号不能被捕获

F 信号不能被忽略

参考文章:
https://www.cnblogs.com/WangBoBlog/p/8081284.html Linux 的信号和线程
https://blog.csdn.net/xwc583413343/article/details/55106337 信号注册函数回收子进程,waitpid非阻塞回收
https://blog.csdn.net/hacode/article/details/43483057 Linux 实时信号程序中锁的探索
https://blog.csdn.net/yusiguyuan/article/details/14229017 Linux 多线程应用中如何编写安全的信号处理函数
https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html Linux信号(signal) 机制分析

linux信号处理相关知识的更多相关文章

  1. Linux Epoll相关知识

    其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及 ...

  2. Linux中相关知识(atexit(),fork(),粘滞位)

    1.atexit()函数 函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(v ...

  3. linux编译相关知识

    (1)用g++编译程序时,-l 与-L各是什么意思 http://bbs.chinaunix.net/thread-107364-1-1.html 感谢作者 -l 表示:编译程序到系统默认路进搜索,如 ...

  4. < 独立项目 - 文本挖掘 > - 2016/10/25 第一更 - <Linux相关知识准备>

    < 独立项目 -  文本挖掘 > 项目立项的相关背景介绍,TODO方向. 一.Ubuntu环境配置 主机系统:Windows 7 SP1  64位操作系统 | i5-4210 CPU | ...

  5. linux 创建守护进程的相关知识

    linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...

  6. Linux入门之安装及相关知识。

    一.VMware虚拟机安装与使用 1.1.VMware 简介 VMware是一个虚拟PC的软件,可以在现有的操 作系统上虚拟出一个新的硬件环境,相当于模拟 出一台新的PC.以此来实现在一台机器上真正 ...

  7. LINUX涉及网络相关知识

    才接触到网络的老铁,是否比较晕呢? 简单记录一下网络相关知识吧(IPV4)! A0. 网络号.主机号 A1.网络地址分类: A2. 保留地址: A3. 子网掩码作用:(子网掩码.IPV4地址做“与”运 ...

  8. Linux相关知识笔记

    Quagga要在linux下编译并配置运行,所有,学习一点linux的基础知识. 安装的Ubuntu,用户名linux,密码1 使能Ubuntu的IP转发功能,需要修改etc/sysctl.conf和 ...

  9. Linux相关知识基础

    目录 前言 第一章 Linux远程连接管理 1. 为什么要远程连接Linux系统 2. 连接前的小知识 2.2.1 IP地址 2.2.2 端口的概念 2.2.3 协议的概念 3. 远程连接Linux的 ...

随机推荐

  1. ApiCloud模块链接

    城市选择器 页面左右滑动 识别信用卡 图像coverFlow  输入框  图片浏览器  百度地图                                                     ...

  2. 博客存档TensorFlow入门一 1.4编程练习

        import tensorflow as tf import numpy import matplotlib.pyplot as plt #from sklearn.model_selecti ...

  3. UIWebView 获取网页标题

    - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *urlString = webView.request.URL.absolu ...

  4. 学习VCL之路(1)

    在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息分发机制相关的. Dispatch()负责将特定的消息分发给合适的消息处理函数.首先它会在 ...

  5. winfroms更换皮肤

    一.添加控件lrisSkin.dll 然后把继承的窗体更换成别人做好的窗体类 能达到换肤的效果     二. 全部源代码就一行: skinEngine1.SkinFile = "WaveCo ...

  6. node里使用supervisor

    1.npm -g install supervisor(安装) 2.用cd命令定位到项目的根目录 3.supervisor bin/www

  7. linux 学习第十三天(screen不间断会话、apache服务、SELinux安全子系统)

    一.screen 命令不间断会话 1.安装screen(从系统镜像作为yum仓库安装) 1.1.加载系统镜像 1.2.mount /dev/cdrom /media/cdrom/  (挂在系统镜像) ...

  8. fail2ban 防暴力破解总结

    公司服务器安全问题一直是个令人头疼的问题,许多运维的小伙伴一直在用脚本来监控服务器登录状态,然而脚本编写比较麻烦,今天就给大家推荐一款小而精致的防暴力破解工具 fail2ban ,他可以监控系统日志, ...

  9. work notes

    本喵,一个快乐的web开发肥宅程序媛,参与过手机端.电视TV端.电脑端的开发.工作之余,总结了一些经验[避坑指南]分享给大家- 1. webView内嵌h5页面时,如果内嵌的页面有出现手机自带键盘或者 ...

  10. 课时54.audio标签(掌握)

    1.什么是audio标签? 播放音频 格式: <audio src=""> </audio> 也是由于同样的适配问题,所以出现了第二种格式 <audi ...