【信号】SIGCHLD信号--了解

news2024/11/13 17:59:11

SIGCHLD是多少号信号呢?17号

我们知道用wait和waitpid函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂。
其实,子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。


请编写一个程序完成以下功能:父进程fork出子进程,子进程调用exit(2)终止,父进程自定义SIGCHLD信号的处理函数,在其中调用wait获得子进程的退出状态并打印。 

mysigchld.cc

#include<iostream>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>

using namespace std;

void handler(int signo)
{
    //父进程在接收到17号信号后,在自定义函数信号捕捉里进行子进程的处理工作
    cout<<"i get signo: "<<signo<<endl;
    int status=0;
    int rid=waitpid(-1,&status,0);
    if(rid<0)
    {
        perror("waitpid");
        exit(1);
    }
    cout<<"recovery child success"<<endl;
    cout<<"child exit code: "<<((status>>8)&0xFF)<<" exit signo: "<<(status&0x7F)<<endl;
}
int main()
{
    signal(17,handler);
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        exit(1);
    }
    else if(id==0)
    {
        //child
        int cnt=0;
        while(true)
        {
            cout<<"i am child pid: "<<getpid()<<" ppid: "<<getppid()<<endl;
            cnt++;
            if(cnt==5) exit(2);
            sleep(1);
        }
    }

    //father 父进程自己干自己的事,当收到子进程退出信号后,就处理子进程
    while(true)
    {
        cout<<"i am father pid: "<<getpid()<<endl;
        sleep(1);
    }
    return 0;
}

事实上,由于UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用sigaction(也可以用signal)将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认17号信号的处理动作是忽略动作和用户用sigaction函数自定义的忽略 通常是没有区别的,但这是一个特例。此方法对于Linux可用,但不保证在其它UNIX系统上都可用。

下面的程序验证这样做不会产生僵尸进程

 

#include<iostream>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>

using namespace std;

int main()
{
    signal(17,SIG_IGN);
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        exit(1);
    }
    else if(id==0)
    {
        //child
        int cnt=0;
        while(true)
        {
            cout<<"i am child pid: "<<getpid()<<" ppid: "<<getppid()<<endl;
            cnt++;
            if(cnt==5) 
            {
                cout<<"child quit"<<endl;
                exit(2);
            }
            sleep(1);
        }
    }

    //father 父进程自己干自己的事,当收到子进程退出信号后,就处理子进程
    while(true)
    {
        cout<<"i am father pid: "<<getpid()<<endl;
        sleep(1);
    }
    return 0;
}

 

发现已经处理了子进程,没有导致僵尸 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iptables实现内外网ip转换

准备三台虚拟机 内网访问外网 网络设置为仅主机&#xff08;关闭DHCP功能&#xff09; 设置一台双网卡机器充当iptables服务器 设置一台内网机 设置一台外网机&#xff0c;下载并开启httpd服务 在iptables服务器上设置iptables 在/etc/sysctl.conf中添加net.ipv4.ip_forwar…

零基础入门大模型,带你构建第一个大模型:实战指南

2017年是机器学习领域历史性的一年。Google Brain 团队的研究人员推出了 Transformer&#xff0c;它的性能迅速超越了大多数现有的深度学习方法。著名的注意力机制成为未来 Transformer 衍生模型的关键组成部分。Transformer 架构的惊人之处在于其巨大的灵活性&#xff1a;它可…

2024年上半年互联网黑灰产研究报告

2024年上半年&#xff0c;黑灰产从业人员人数超过427万&#xff0c;威胁猎人监测到国内作恶手机号数量高达323万&#xff0c;日活跃风险IP数量1136万&#xff0c;涉及洗钱银行卡数量19.5万。 近年来&#xff0c;数字化与实体经济的融合日渐深入&#xff0c;大规模业务线上场景…

Golang开发之路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

做谷歌seo,b端跟c端有什么区别吗?

事实上大部分都没有区别&#xff0c;谷歌seo要做的事情其实都差不多&#xff0c;站内优化&#xff0c;站外推广&#xff0c;唯一不同的&#xff0c;就是在关键词的调研以及创建内容的时候不同&#xff0c;不过光是这一点不同&#xff0c;就能导致B端网站跟C端网站的决定性差异&…

HTML + js 生成一个线路走向图,可以标记总共有多少站,用户到达第几站了

文章目录 前言一、用途二、使用步骤1.轨迹代码2.运行前言 HTML + js 生成一个线路走向图 例如:用来记录用户到达那一站了,可以标记总共有多少站,用户到达第几站了 提示:以下是本篇文章正文内容,下面案例可供参考 一、用途 用来记录用户到达那一站了,可以标记总共有多少…

保姆级AI编程Cursor-Vscode使用教程

一: 下载&#xff0c;安装(输入语言后&#xff0c;然后迁移插件) 下载地址&#xff1a;https://www.cursor.com/settings 二: 登录 三. 玩AI--给一张UI图&#xff0c;一键生成需求代码&#xff08;需要自己去小改一下&#xff0c;大部分都可用&#xff09; 四、项目实践-优…

苹果手机管理软件哪个好用 苹果手机如何从安卓手机导入数据

随着科技的发展&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。苹果手机以其稳定的性能和卓越的用户体验受到广大用户的喜爱。然而&#xff0c;如何高效管理苹果手机以及如何从安卓手机导入数据&#xff0c;是许多用户在使用过程中常遇到的问题。本文将围绕“苹果手…

异步和多线程

概念 异步&#xff08;Asynchronous&#xff09;&#xff1a; 异步是一种编程模型&#xff0c;其核心思想是在等待I/O操作&#xff08;如文件读写、网络通信等&#xff09;完成时&#xff0c;不阻塞当前线程的执行&#xff0c;而是允许程序继续执行其他任务。当I/O操作完成后&…

Linux系统调用进程标识符

目录 一、冯诺依曼体系结构 二、操作系统 2.1什么是操作系统&#xff1f; 2.2为什么需要操作系统&#xff1f; 2.3怎么管理&#xff1f; 2.4总结 2.5系统调用 三、进程的理解 3.1进程的基本概念 3.2对进程的描述 3.3对进程的组织 3.4task_struct内容的分类 3.5Linux下…

2024年【危险化学品生产单位安全生产管理人员】考试资料及危险化学品生产单位安全生产管理人员考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品生产单位安全生产管理人员考试资料为正在备考危险化学品生产单位安全生产管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品生产单位安全生产管理人员考试试卷祝您顺利通过…

5大公有公有云数据库厂商发展太猛!作为DBA的我,有点焦虑!

未来数据库的战场主要是公有云&#xff0c;且公有云的比重确实也在逐年上升&#xff0c;那么是不是这么回事呢&#xff1f;我们来分别看下几个云厂商巨头的公有云营收和增速&#xff01; 全球公有云王者AWS 2022年半年报&#xff1a; 2023年半年报&#xff1a; 2024年半年报&a…

Games101笔记-线性代数(一)

1、图形学和计算机视觉的区别 计算机视觉&#xff1a;一切需要猜测的都可以归类到计算机视觉 图形学&#xff1a;光栅化、几何、光追、动画/模拟 2、向量 向量表示2个东西&#xff1a;方向长度&#xff0c;向量与起始位置无关 向量加法&#xff1a;得到1个三角形或者平行四边…

分享一波中高级测试面试题(偏Java)

dubbo协议介绍下 Dubbo是一款高性能、轻量级的开源RPC框架&#xff0c;支持多种协议&#xff0c;其中之一就是Dubbo协议。 Dubbo协议是一种基于TCP的高性能传输协议&#xff0c;它是Dubbo框架默认的传输协议。Dubbo协议采用了一种自定义的数据传输格式&#xff0c;采用简单的…

java之认识异常

在 Java 中&#xff0c;异常&#xff08;Exception&#xff09;用于处理程序运行时出现的错误或异常情况。Java 的异常处理机制基于 try, catch, finally 和 throw 关键字。 1.异常的分类&#xff1a; 1.1&#xff1a;检查型异常(CheckedException)&#xff1a; 定义:程序在…

ChatGPT实战100例 - (21) 搞定汉字新解,o1-mini 在李继刚老师这扳回一局

文章目录 搞定汉字新解,o1-mini 在李继刚老师这扳回一局翻车开车飙车出图福利在这福利+1搞定汉字新解,o1-mini 在李继刚老师这扳回一局 昨天朋友圈刷爆了 李继刚老师 的 汉字新解,废话不说,上 prompt ;; 作者: 李继刚 ;; 版本: 0.1 ;; 模型: Claude Sonnet ;; 用途: 将一…

【2025】基于PHP职业病健康管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

参数传了报错没传参数识别不到参数传丢

【记一次参数传值了但报错未传值的问题解决历程】 问题描述&#xff1a;同一个接口&#xff0c;用测试类调可以成功&#xff0c;用postman调用一直报错少参数&#xff0c;后又尝试了用idea自带的http调用&#xff0c;同样报错参数未传值。 如图&#xff0c;传值了报错未传值。…

怎样还原空白试卷?2024教你快速还原空白试卷的软件

怎样还原空白试卷&#xff1f;2024教你快速还原空白试卷的软件 还原空白试卷是一项常见的需求&#xff0c;尤其是在教学、考试准备或练习时需要重新使用原有试卷时。通过使用AI技术或专业的图片编辑软件&#xff0c;能够快速去除试卷上的答案或标记&#xff0c;恢复原始空白状…

卷积神经网络(二)CIFAR100类别分类

一.数据介绍 总共一百个类&#xff0c;每个类有600个图像。每类500个训练图像&#xff0c;100个测试图像。没填图像都带有一个"精细"标签&#xff08;它所属的类&#xff09;核一个粗糙标签&#xff08;它所属的超类&#xff09; 二.API使用 用于构建CNN模型的API …