因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生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. yum 安装 php5.6

    yum 安装 php5.6 安装 PHP rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noa ...

  2. windows系统安装erlang

    1.什么是erlang erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境.Erlang是一个结构 ...

  3. Fiddler模拟Http请求

    Fiddler模拟Http请求 一.自定义Http请求:

  4. HDU 3746 Cyclic Nacklace(求补齐循环节最小长度 KMP中next数组的使用 好题!!!)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. openstack 虚拟机 迁移

    迁移. 如果 你的 云 系统 正在 使用 共享 存储, 使用 nova live- migration 命令 就可以. 首先, 要 获得 需要 被 迁移 的 实例 列表: # nova list -- ...

  6. DataFrame 加减乘除

    headlist = ['a', 'b'] datalist = [[1, 2], [0,3], [3,2]] df = pd.DataFrame(data=datalist,columns=head ...

  7. 结合cocos2d-x开发配置sublime text

    开发cocos2d-x前端的非核心开发人员对于编辑器的选择,多数的选择有两个,一个是传统的ultraedit,另外的就是现在很流行的sublime text.以前我是比较喜欢用ultraedit的,但 ...

  8. C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)

    最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好,特别是当构造函数带参数的时候.MSDN上给出的例子十分复杂,网上的 ...

  9. es6 入坑笔记(五)

    Symbol 主要用做key或私有变量,Symbol是唯一的不可重复的,也是一个单独的数据类型 定义形式: let demo=Symbol("aaaa"); 1.Symbol不能使 ...

  10. 购物车功能:使用jQuery实现购物车全选反选,单选,商品增删,小计等功能

    效果图: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...