因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生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. Jenkins+Ant+Jmeter接口自动化集成测试实例

    Jenkins+Ant+Jmeter接口自动化集成测试实例 一.Jenkins安装配置 1.安装配置JDK1.6+环境变量: 2.下载jenkins.war,放入C:\jenkins目录下,目录位置随 ...

  2. jfinal多数据源ActiveRecordPlugin

    因为项目需要从多个数据库取数据,所以需要配置多个数据源 尝试了ActiveRecordPlugin和DruidPlugin的多数据源,但是因为DruidPlugin在本地一直报错一个很奇怪的语法错误, ...

  3. MySQL5.7.19 免安装配置 + Navicat for MySQL安装和破解(附全部资源)

    近段时间因为工作原因安装了好多次本地MySQL,安装过程也是时有曲折,索性记录一下. 环境: Win10 家庭版 MySQL5.7.19   (链接:https://pan.baidu.com/s/1 ...

  4. ORACLE逐行累计求和方法(OVER函数)

    1.RANK ( ) OVER ( [QUERY_PARTITION_CLAUSE] ORDER_BY_CLAUSE ) DENSE_RANK ( ) OVER ( [QUERY_PARTITION_ ...

  5. macOS,安装+配置+激活:MySQL8.0 + Navicat Premium12

    作者的电脑是10.13.3,些许配置偏差请自行略过 本文是学习探讨途径,请勿滥用,后果自负 MySQL8.0 篇章 官网http://www.mysql.com/downloads/ 下载即可,无需激 ...

  6. 一个简单的Linux启动jar包的shell脚本

    背景: 项目设备端需要运行jar包程序与服务端进行socket连接并发送数据,每次启动进程时,都需要在Linux终端输入启动jar包的命令,比较繁琐,随之尝试将启动jar包的命令写入shell脚本文件 ...

  7. PHP-----PHP程序设计基础教程----第四章数组

    4.1 初识数组 4.1.1 什么是数组 数组是一个可以存储一组或者一系列数值的变量.在PHP中,数组中的元素分两部分,分别为键(Key)和值(Value).其中,“键”为元素的识别名称,也被称为数组 ...

  8. 学习html的第一天

    HTML 第一章: webde 运行环境: 1. 什么是HTML HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言:HyperText Markup Languge 超文本 就是网 ...

  9. 我的 Delphi 学习之路 —— Delphi 助手的安装

    标题:我的 Delphi 学习之路 -- Delphi 助手的安装 作者:断桥烟雨旧人伤 Delphi 助手的安装 CnWizards 类似于 VS 中的番茄助手,在编写 Delphi 代码时帮助极大 ...

  10. A.Activity planning

    题目描述There is a collection of n activities E={1,2,..,n}, each of which requires the same resource, su ...