Linux信号:SIGCHLD信号和僵尸进程

news2024/11/28 20:46:34

1. SIGCHLD信号产生条件:

        (1)子进程终止;

        (2)子进程收到SIGSTOP暂停;

        (3)子进程处于暂停状态,收到SIGCONT被唤醒。


2. 捕捉SIGCHLD,避免僵尸进程:

方式1:

注册信号处理函数,捕捉SIGCHLD信号后回收。

示例:

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

void waitforchild(int signum) {  // 收到子进程退出信号,才会执行信号处理函数
    printf("捕捉到信号%d, 回收子进程..\n", signum);
    while (waitpid(-1, NULL, WNOHANG) > 0) { // 非阻塞方式回收子进程
    }
    printf("回收到一个子进程,退出回收处理函数...\n");
}

int main(int argc, const char* argv[]) {

    pid_t pid = -1;
    int ret = -1;

    struct sigaction act;
    act.sa_handler = waitforchild; // 信号处理函数
    act.sa_flags = 0; // 使用旧的信号处理函数

    // 收到子进程退出信号,才会执行信号处理函数
    ret = sigaction(SIGCHLD, &act, NULL);
    if (-1 == ret) {
        perror("sigaction");
        return 1;
    }

    pid = fork();
    if (-1 == pid) {
        perror("fork");
        return 1;
    }

    if (0 == pid) { // 子进程
        sleep(1);
        printf("子进程即将退出!\n");
        exit(0);
    } else { // 父进程
        sleep(2);
        system("ps -aux | grep Z"); // 查看是否有僵尸进程
    }

    printf("父进程也结束了.\n");
    return 0;
}

运行结果:

根据结果中橙色方框的内容:回收了两次子进程,说明存在两个子进程;但程序中只有一个fork,为什么会有两个子进程呢?

注意:43行的system也会创建一个子进程!


方式2:

若父进程不关心子进程结束,则可使用sigaction或signal函数通知内核父进程会忽略SIGCHLD信号,则子进程结束后,内核会回收,并不再给父进程发送该信号。

示例:

本程序中,子进程先退出了,且父进程未使用wait或waipid回收。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>

int main(int argc, const char* argv[]) {

    pid_t pid = -1;
    int ret = -1;

    struct sigaction act;
    act.sa_handler = SIG_IGN; // 忽略该信号
    act.sa_flags = 0; // 使用旧的信号处理函数

    /*忽略SIGCHLD信号,
    则子进程结束后,由内核回收,不会再给父进程发信号*/
    ret = sigaction(SIGCHLD, &act, NULL);
    if (-1 == ret) {
        perror("sigaction");
        return 1;
    }

    pid = fork();
    if (-1 == pid) {
        perror("fork");
        return 1;
    }

    if (0 == pid) { // 子进程
        sleep(1);
        printf("子进程已结束!\n");
        exit(0);
    } else { // 父进程
        sleep(2);
        system("ps -aux | grep Z"); // 查看是否有僵尸进程
    }

    printf("父进程也结束了.\n");
    return 0;
}

运行结果:

ps命令看到无僵尸进程。

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

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

相关文章

网络钓鱼:工作场所保护电子邮件安全的五个步骤

导语&#xff1a;Sophos电子邮件产品管理高级总监David Mitchell分享了他的主要技巧&#xff0c;以优化工作场所的电子邮件安全性。 Sophos电子邮件产品管理高级总监David Mitchell分享了他的主要技巧&#xff0c;以优化工作场所的电子邮件安全性。 尽管工作场所的聊天和即时…

云原生时代崛起的编程语言Go基础实战

文章目录 概述定义使用场景Go 安全 使用须知搜索工具Go基础命令标准库 基础语法Effective Go 概览命名规范注释变量常量(const)控制结构数据类型迭代&#xff08;range&#xff09;函数指针字符串和符文结构体(struct)方法接口(interface)泛型错误&#xff08;errors&#xff0…

iOS描述文件(.mobileprovision)一键申请

转载&#xff1a;IOS描述文件制作教程 iOS描述文件(.mobileprovision)一键申请 在主界面上点击描述文件按钮。 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 新建ios描述文件 然后点击新建&#xff0c;然后输入描述文件名称&…

数据库设计与前端框架

数据库设计与前端框架 学习目标&#xff1a; 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术&#xff08;Multi-TenancyTechnology&a…

【密码算法 之六】CCM 浅析

CCM模式浅析 1. 综述2. 加密2.1 前置条件&#xff08;Prerequisites&#xff09;2.2 输入&#xff08;Input&#xff09;2.3 输出&#xff08;Output&#xff09;2.4 加密流程&#xff08;Steps&#xff09; 3. 解密3.1 前置条件&#xff08;Prerequisites&#xff09;3.2 输入…

Orangepi Zero2 全志H616简介

为什么学 学习目标依然是Linux 系统 &#xff0c;平台是 ARM 架构 蜂巢快递柜&#xff0c;配送机器人&#xff0c;这些应用场景用C51,STM32单片机无法实现 第三方介入库的局限性&#xff0c;比如刷脸支付和公交车收费设备需要集成支付宝SDK&#xff0c;提供的libalipay.so 是…

【VM服务管家】VM4.0平台SDK_2.2 模块API类

目录 2.2.1 方案保存&#xff1a;方案高速保存的方法2.2.2 Group模块&#xff1a;Group输入输出图像数据的方法2.2.3 模块操作类&#xff1a;设置输入图像、参数和ROI的方法2.2.4 图像源&#xff1a;通过图像源模块接口设置图像输入的方法2.2.5 图像源&#xff1a;通过SDK传入相…

go 语言环境安装(Windows 系统下安装)

go 语言官网:The Go Programming Language 下载 go 安装包的网址&#xff1a;All releases - The Go Programming Language go 支持很多种操作系统 Windows 系统下 - 安装和配置SDK 一、SDK 介绍 SDK 的全称是 Software Development Kit &#xff0c;即 软件开发工具包 二…

STM32物联网实战开发(1)——全新的程序框架

现在STM32公司主推的是HAL库的开发&#xff0c;标准库已经不再更新。通过STM32cubeMX的图形界面生成代码非常的方便。 一、程序框架的构想 1、STM32cubeMX 生成的代码与添加的应用代码分离&#xff1b; 2、利用 STM32cubeMX 重新生成代码&#xff0c;不影响应用代码&#xf…

zabbix配置钉钉告警(附含钉钉告警脚本 · 实战亲测无任何问题)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 钉钉上操作&#xff08;钉钉告警以关…

密码学新进展:基于同态加密的数据保护是否会成为未来的趋势?

第一章&#xff1a;引言 在今天这个数字时代&#xff0c;数据的重要性不断增加&#xff0c;已经成为了现代社会最宝贵的财富之一。各种机构和企业在日常运营中都会处理大量的数据&#xff0c;包括用户信息、财务数据、产品销售数据等。这些数据的安全性非常重要&#xff0c;因…

2.5 定点运算器的组成

学习目标&#xff1a; 具体包括以下几点&#xff1a; 了解定点运算器的基本概念和分类&#xff0c;包括定点运算器的分类、常见的定点运算器类型等&#xff1b;学习定点运算器的基本组成部分&#xff0c;包括输入/输出接口、寄存器、算术逻辑单元(ALU)、控制单元等&#xff0…

VS Code C++ 输出窗口中文乱码问题解决

VS Code C 输出窗口中文乱码问题解决 系统cmd终端乱码 的情况&#xff1a;原因解决方法&#xff1a;&#xff08;仅针对cmd终端输出的情况&#xff09;方法一&#xff1a;更改代码文件的编码方法二 &#xff1a;更改cmd默认终端的编码方式 系统cmd终端乱码 的情况&#xff1a; …

2023年的深度学习入门指南(10) = 前端同学如何进行chatgpt开发

2023年的深度学习入门指南(10) 前端同学如何进行chatgpt开发 在第二篇&#xff0c;我们使用openai的python库封装&#xff0c;搞得它有点像之前学习的PyTorch一样的库。这一节我们专门给它正下名&#xff0c;前端就是字面意义上的前端。 给gpt4写前端 下面我们写一个最土的…

“BIM+智慧工地”精准“数字化”变身智慧工程“管家”

用手机对着满载钢筋的卡车拍照&#xff0c;手指选定一下钢筋范围&#xff0c;几秒后&#xff0c;屏幕就能迅速识别车上有多少根钢筋——这是建筑产业数字化管理智慧工程的应用领域之一。 投资1.78亿元建设的贵州民航产教融合实训基地是集实践教学、社会培训、企业生产保障和科研…

学历与就业:我对“孔乙已长衫”现象的思考

一、你认为社会对于学历和职业之间的关系认知是怎样的&#xff1f; 在当前的社会中&#xff0c;学历往往被看作是一个人能否获得好工作的重要标准。许多用人单位更愿意录取拥有更高学历的求职者&#xff0c;因为他们通常具备更广阔的知识视野和更强的理论基础。然而&#xff0…

Presto之Left Join和Right Join的实现

一. 前言 我们知道&#xff0c;在Presto中&#xff0c;与inner join相比&#xff0c;left join会保留probe表&#xff08;左表&#xff09;的所有值&#xff0c;right join会保留build表&#xff08;右表&#xff09;的所有值。inner join的是实现在文章Presto之Hash Join 数据…

攻击者可以使用HTML和CSS隐藏“外部发件人”电子邮件警告

导语&#xff1a;研究人员近日证实&#xff0c;Microsoft Outlook等客户端向电子邮件收件人显示的“外部发件人”警告可能被发件人隐藏。 研究人员近日证实&#xff0c;Microsoft Outlook等客户端向电子邮件收件人显示的“外部发件人”警告可能被发件人隐藏。 事实证明&#x…

【数据结构】一篇带你彻底玩转 链表

文章目录 链表的概念及结构链表的分类链表接口的实现链表打印链表申请节点链表尾插链表头插链表尾删链表头删链表查找链表在指定位置之后插入数据链表删除指定位置之后的数据链表在指定位置之前插入数据链表删除指定位置之前的数据链表删除指定位置的数据链表的销毁 链表的概念…

总结835

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;熟练背诵《大独裁者》&#xff0c;最后默写。抄写今后要背诵的两篇文章。 高等数学&#xff1a;做…