SIGCHLD信号处理

2024-02-05 19:58
文章标签 信号处理 sigchld

本文主要是介绍SIGCHLD信号处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在apue这本书中,介绍了早期System V不可靠信号中SIGCLD的经典语义。如在RH7.2上编译并运行该程序则一切正常(不会出现重复打印"SIGCLD received"),

因为: 
1)现今的Unices系统(包括Linux)都提供了可靠的信号机制. 
2)Linux(RH7.2,kernel 2.4.7)上对SIGCLD的处理是: #define SIGCLD SIGCHLD. 
btw: 现在的程序大都使用SIGCHLD(POSIX也是采用的该信号),而不用SIGCLD.

早期System V信号的一个问题是:捕捉到一个信号后,系统将对该信号的处理设为默认.因此很多的signal handler都这样写: 
sig_xxx() 

 signal(SIGXXX, sig_xxx); /* 为捕捉下一个该信号 */ 
 ... 

即便这样,如果在执行这句signal前又有一个SIGXXX产生,那么系统仍会按默认处理(i.e., 忽略该信号, 或终止该进程, etc.),有可能造成信号丢失. APUE还介绍了另一个问题(请参考section 10.4)

http://www.unixresources.net/linux/clf/program/archive/00/00/27/46/274615.html

 

APUE上SIGCLD语义写的有点不清楚,到底我们的系统是如何来处理SIGCLD信号呢? 
    1.SIG_DFL :默认的处理方式是不理会这个信号,但是也不会丢弃子进行状态,所以如果不用wait,waitpid 对其子进行进行状态信息回收,会产生僵尸进程。 
    2.SIG_IGN :忽略的处理方式,这个方式和默认的忽略是不一样的语意,暂且我们把忽略定义为SIG_IGN,在这种方式下,子进程状态信息会被丢弃,也就是自动回收了,所以不会产生僵尸进程,但是问题也就来了,wait,waitpid却无法捕捉到子进程状态信息了,如果你随后调用了wait,那么会阻塞到所有的子进程结束,并返回错误ECHILD,也就是没有子进程等待。 
   3.自定义处理方式:SIGCLD会立即检查是否有子进程准好被等待,这便是SIGCLD最大漏洞了,一旦在信号处理函数中加入了信号处理方式重建的步骤,那么每次设置SIGCLD处理方式时,都会去检查是否有信号到来,如果此时信号的确到来了,先是调用自定义信号处理函数,然后是调用信号处理方式重建函数,在重建配置的时候,会去检查信号是否到来,此时信号未被处理,会再次触发自定义信号处理函数,一直循环。所以在处理SIGCLD时,应该先wait处理掉了信号信息后,再进行信号处理方式重建signal。

这篇关于SIGCHLD信号处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681991

相关文章

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

《数字信号处理》学习04-离散时间系统中的线性时不变系统

目录 一,系统及离散时间系统   二,离散时间系统中的线性时不变系统 1,线性系统  1) 可加性  2) 比例性(齐次性) 3)叠加原理(叠加性质)  2,时不变系统(移不变系统) 通过前几篇文章的学习,此时我对序列的相关概念和运算已经有所掌握,接下来我将开始学习新的概念“离散时间系统中的线性时不变系统”, 一,系统及离散时间系统  首先需要知道系统的概念,在《信

【Get深一度】信号处理(二)——傅里叶变换与傅里叶级数的区别与联系

1.傅里叶级数和傅里叶变换:  傅里叶级数对周期性现象做数学上的分析 傅里叶变换可以看作傅里叶级数的极限形式,也可以看作是对周期现象进行数学上的分析。 除此之外,傅里叶变换还是处理信号领域的一种很重要的算法。要想理解傅里叶变换算法的内涵,首先要了解傅里叶原理的内涵。 傅里叶原理表明:对于任何连续测量的数字信号,都可以用不同频率的正弦波信号的无限叠加来表示。     傅里叶变

【Get深一度】信号处理(一)——能量信号与功率信号的区别

1.1 能量信号与功率信号的区别         通常情况下,电信号默认为电流(I)或电压(V),有两种主要类型:能量信号、功率信号。相信有朋友现在依然还是傻傻分不清楚这两者之间的区别。 下面我将进行分条详述:(关键词已加黑)        1)能量信号:表现为    确定或随机        2)功率信号:变现为    周期或随机          注:其中随机信号是比较好理解的

【Get深一度】信号处理必经之坎:相关与卷积【由理论至仿真】

相关与卷积的计算公式想必大家一看便懂,可其中奥义,囫囵吞枣,不得奇妙,原理与物理意义,我要吃了你们 相关函数:外衣不神秘,先剥开看看 信号啊信号,多想将你蹂躏,事实上,却反被蹂躏至死 … 信号到底是个什么东西,千百年来为何无数先人前赴后继,说白了就是电磁波;深了点就是电磁波的形状包含了信息;再深了点就是电磁波的形状被编了码或加了密;归根究底,就是电磁波嘛,只不过像是雕刻艺术一样搞得富

《数字信号处理》学习03-矩形序列,实指数序列和复指数序列

目录 一,矩形序列 1,由单位阶跃序列组成  2,由单位冲击序列组成 二,实指数序列 三,复指数序列  这篇文章着重学习:矩形序列,实指数序列和复指数序列。其它序列都比较简单,这里不再赘诉。 相关内容参考自:唐向宏著作的《数字信号处理》P12,电子书籍请通过专栏下的链接下载。 一,矩形序列 矩形序列用 表示。 其中 N 表示矩形序列的序列值 1 的数量(个数)(N

[数字信号处理][Python] numpy.gradient()函数的算法实现

先看实例 import numpy as npsignal = [3,2,1,3,8,10]grad = np.gradient(signal)print(grad) 输出结果是 [-1. -1. 0.5 3.5 3.5 2. ] 这个结果是怎么来的呢? np.gradient 计算信号的数值梯度,也就是信号值的变化率。它使用中心差分法来计算中间点的梯度,并使用前向差分法和后向差分法

【FPGA数字信号处理】并行FIR滤波器

​​在数字信号处理领域,FIR(Finite Impulse Response)数字滤波器是一种非常重要的工具。它具有线性相位、稳定性好等优点,被广泛应用于通信、音频处理、图像处理等领域。 今天介绍一下并行 FIR 数字滤波器的原理以及实现。 一、FIR数字滤波器原理解析 1、数字滤波器 数字滤波器是数字信号处理领域的核心组件,它们对信号进行数学处理以增强或抑制某些特性。 数字滤波器按照

《数字信号处理》学习01-离散时间信号与序列的卷积和运算

目录 一,信号 二,序列的运算  1,卷积和  2,matlab实现  相关的电子书籍请到这篇文章所在的专栏,并通过夸克网盘链接下载。 很多简单的知识点我就不再赘述了,接下来就着重记录我学习过程中遇到的较难理解且容易忘记的知识点,如果想要再详细些的,可以在评论区留言。 这篇文章主要是用于整理我在看书过程中自己做的一些记忆方法(个人记忆方法,因人而异,仅供参考) 一,信号