信号 09 | SIGCLD语义

SIGCHLD信号使用和注意事项 1.SIGCHLD简介 SIGCHILD是指在一个进程终止或者停止时,将SIGCHILD信号发送给其父进程,按照系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。注意:SIGCLD信号与其长得非常相似。SIGCLD是系统V的一个信号名,其语义与名为SIGCHLD的BSD信号不同。POSIX.1则采用BSD的SIGCHLD信号。BSD的SIGCHLD信号语义与其他信号的... 阅读详情

1. SIGCLD信号

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

1.1 测试代码:

#include <sys/wait.h>

static void sig_cld(int);

int main()
{
    pid_t pid;

    if (signal(SIGCLD, sig_cld) == SIG_ERR)
        perror("signal error");
    if ((pid = fork()) < 0)
        perror("fork error");
    else if (pid == 0) { /* child */
        sleep(2);
        _exit(0);
    }
    pause(); /* parent */
    exit(0);
}

static void sig_cld(int signo) /* interrupts pause() */
{
    pid_t pid;
    int status;

    printf("SIGCLD received\n");
    if (signal(SIGCLD, sig_cld) == SIG_ERR) /* reestablish handler */
        perror("signal error");
    if ((pid = wait(&status)) < 0) /* fetch child status */
        perror("wait error");
    printf("pid = %d\n", pid);
}

输出结果:程序一行行地重复输出“SIGCLD received”

2. SIGHCLD信号

  • 如果父进程在fork之后调用wait,就会阻塞,直到有一个子进程退出。
  • 如果父进程在fork之前先signal(SIGCLD, Fun),即注册了SIGCLD的信号处理函数。然后做自己的事情。 当子进程退出时,会给父进程发送一个SIGCLD信号。然后Fun函数就会执行。可以在Fun函数中调用wait获得子进程退出时的状态,并且此时wait不会阻塞。 当Fun函数执行完后,父进程又继续做自己的事情。

3.1 测试代码:

#include<sys/wait.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

static void sig_cld(int signo)
{
    pid_t pid;
    int status;
    printf("SIGCLD received\n");
    // wait() 返回退出状态
    if((pid = wait(&status)) <0) {
        printf("wait error\n");
    }
    printf("pid = %d ",pid);
}

int main()
{
    pid_t pid;
    // if(signal(SIGCLD,sig_cld) ==  SIG_ERR)
    if(signal(SIGCHLD,sig_cld) ==  SIG_ERR) {
        printf("signal error\n");
        exit(-1);
    }
    if((pid = fork()) < 0) {
        printf("fork error\n");
        exit(-1);
    }
    else if(pid == 0) {
        //child
        printf("%d fork a new child %d\n",getppid(),getpid());
        sleep(1);
        exit(0);
    } else {
        //parent
        // sig_cld(0);
        int i,j;
        for(i=0;i<100;i++) {
            for(j=0;j<10000000;j++);
            printf("%d ",i);
        }
    }
}

输出结果:

3. 参考资料

进程间通信---两个重要的信号SIGALRM信号&SIGCLD信号 1、SIGALRM信号 alarm函数实现了定时发送SIGALRM信号的功能。(每一个进程都有一个唯一的计时器) unsigned int alarm(unsigned int seconds) 参数seconds:设定定时时间,超过这个时间时发送SIGALRM信号 返回值:返回定时器剩余描述 结合一个示例: #include&lt;stdio.h&gt; #include&lt;... 阅读详情

相关推荐

SIGCHLD` 信号详解

SIGCHLD信号用于父进程处理子进程状态变化,例如子进程退出、停止或恢复。主要用途:回收子进程资源,避免僵尸进程,并监控子进程状态。信号处理:使用waitpid来回收已终止的子进程,确保信号处理器中使用非阻塞的waitpid,以避免阻塞父进程。

h52013141的博客 1289

信号之中断的系统调用、可重入函数、SIGCLD语义以及可靠信号术语和语义

本文来自个人博客:https://dunkwan.cn 文章目录中断的系统调用可重入函数`SIGCLD`语义可靠信号术语和语义 中断的系统调用 早期UNIX系统的一个特性是:如果进程在执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行。该系统调用返回出错,其errno设置为EINTR。这样处理是因为一个信号发生了,进程捕捉到它,这意味着已经发生了某种事情,所以是个好...

Dunk.Wan 503

Allegro17.4原理图-PCB双向联动技巧:从网表生成到同步高亮

本文深入解析了Cadence Allegro 17.4中原理图与PCB的深度双向联动技巧。核心在于通过精准的网表生成与管理、实时的跨窗口交互高亮与信号追踪,以及元件与封装的智能匹配更新,构建高效协同设计工作流。掌握这些技巧能显著提升高速、高密度电路设计的效率与准确性,实现从逻辑设计到物理实现的无缝衔接。

weixin_29178069的博客 359

APUE编程:73---信号处理(SIGCLD、SIGHCLD信号处理)

一、SIGCLD、SIGHCLD信号 SIGCLD和SIGHCLD这两个信号很容易混淆: SIGCLD是System V采用的信号名 SIGCHLD是BSD采用的信号名。POSIX.1也采用BSD的SIGCHLD信号 只有Linux 3.2.0和Solaris 10定义了SIGCLD,SIGCLD等同于SIGCHLD 务必了解你所使用的系统实现中SIGCHLD或SIGCLD信号的...

董哥的黑板报 1425

HDRnet——双边滤波和仿射变换的摇身一变

layer层数越多,下采样得到的图越小,low-level features的好处是最后的grid会更coarser,最后的特征图的感受野也越多,非线性更好,表达力更强。所以最终grid是5维的[B,in*out,n,H,W],permute之后是[B,H,W,n,in*out],B是batchsize,n表示对guide的量化级数,in*out表示每个cell的变换系数。这部分的处理对象是低分辨率图,利用CNN进行特征提取(局部和全局),最后fuse得到grid,这里面包含了变换的系数。

zcg1942的博客 1577

Hyper-V虚拟机 安装 银河麒麟V10桌面版

如何在windows 11 Hyper-V 虚拟机中 安装 银河麒麟V10桌面版。

m0_46756112的博客 3421

Linux常用SIG信号及其键值

文章转载自 http://blog.youkuaiyun.com/god2469/article/details/9713395

Justin_Yaphet的专栏 739

STM32F407驱动OV2640摄像头:从SCCB协议到I2C模拟的保姆级避坑指南

本文详细介绍了STM32F407驱动OV2640摄像头的完整流程,重点解析SCCB协议与I2C的关键差异,并提供GPIO模拟实现方案。通过实战案例和调试技巧,帮助开发者避开常见陷阱,实现稳定的图像采集功能。

weixin_28700411的博客 345

Linux 常用SIG信号及其键值

01 SIGHUP 挂起(hangup)02 SIGINT 中断,当用户从键盘按^c键或^break键时03 SIGQUIT 退出,当用户从键盘按quit键时04 SIGILL 非法指令05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行06 SIGIOT IOT指令07 SIGEMT EMT指令08 SIGFPE 浮点运算溢出09 SIGKILL 杀死、终止进程 10...

暴走的二哈 6894

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

安装openclaw时出现node.exe : npm error code EIDLETIMEOUT的解决方案

本文主要介绍了安装openclaw时出现node.exe : npm error code EIDLETIMEOUT的解决方案,希望能对学习使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

linux常见信号归纳

首先介绍两个非常重要的概念 进程组 : 进程组就是一系列相互关联的进程集合,系统中的每一个进程也必须从属于某一个进程组 会话: 会话(session)是一个若干进程组的集合,同样的,系统中每一个进程组也都必须从属于某一个会话; 接下来介绍常见的信号 01 SIGHUP 挂起(hangup) 02 SIGINT 中断,当用户从键盘按c键或break键时 03 SIGQUIT 退出,当用户从键...

刘洪瑞的博客 337

Python 爬虫实战:爬取微博热搜与用户评论数据

本文系统讲解微博热搜榜单与用户评论数据的爬取技术方案。针对微博热搜榜采用Requests+BeautifulSoup解析静态HTML结构,实现高效爬取;对于动态加载的评论数据,使用Selenium模拟浏览器行为规避反爬机制。详细阐述技术选型、反爬策略、数据清洗及存储方法,提供完整代码实现和输出示例。同时强调合规要求,提示开发者需在遵守平台规则的前提下进行数据采集。该方案为舆情分析和热点研究提供了可落地的技术实现路径。

2503_91057718的博客 1716

常用SIG信号及其键值

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34259159的博客 3009

allegro如何设置走线等长

设置走线等长!

weixin_42499230的博客 6935

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux C嵌入式---信号

用来处理异步事件(

qq_46478901的博客 1179

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux信号signal处理机制

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 一、信号的基本概念 1、基本概念 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以...

249

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux信号编程实践(一) 信号概述

中断     中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;     计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务 中断分类 硬件中断(外部中断

NK_test的博客 1993

Linux 信号signal处理机制

<br /> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> <br />Linux 信号signal处理机制<br />        信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。<br />        一、信号的基本概念<br />            1、基本概念<

Richard的专栏 1492

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 分类: Linux2013-09-18 21:14 114人阅读 评论(0) 收藏 举报 进程信号管道消息队列信号量 Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:《linux编程从入门到精通》,《Linux C程序设计大全》,《unix环境高级编程》

pi9nc的专栏 1218

作业必备:操作系统实验四【软中断通信】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_52300499的博客 4977

linux 通过软件中断通信,利用signal和kill(killall)实现软中断通信

关于信号的一些知识一、信号1、信号的基本概念每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质...

weixin_31904867的博客 633
上一篇: 函数signal
下一篇: 【信号】函数kill、raise、abort、alarm
月雲之霄
博客等级 码龄9年 184粉丝 382原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值