用信号的方式回收僵尸进程

news2024/12/23 3:48:41
  1. 当子进程退出后,会给父进程发送一个17号SIGCHLD信号,父进程接收到17号信号后,进入信号处理函数调用waitpid函数回收僵尸进程
  2. 若多个子进程同时退出后,这是切回到父进程,此时父进程只会处理一个17号信号,其他17号信号会被屏蔽。所以17号信号处理函数中只调用一次waitpid函数,可能会造成僵尸进程回收不干净的问题。
  3. 如果成功回收到僵尸进程了,则再收一次,直到没有僵尸进程为止,结束循环

                =0:没有僵尸进程,但是有活着的子进程,函数运行成功

                =-1:没有僵尸进程,且没有子进程,函数运行失败。

17) SIGCHLD 当子进程退出后,父进程会收到该信号。该信号不会让进程退出。

想要简单的回收子进程,直接在父进程的某处wait(0)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
void callback(int sig){
	printf("触发 %d 信号\n",sig);
	pid_t wpid =wait(0);
	printf("wpid=%d\n",wpid);
}
int main(int argc, const char *argv[])
{
	//捕获17号信号
	if(signal(SIGCHLD,callback)==SIG_ERR){
		perror("signal");
		return -1;
	}
	printf("17号信息捕获成功\n");
	int i=0;
	while(i<20){
		if(fork()==0)//子进程
		{
			exit(0);//退出
		}
		i++;//只有父进程会执行i++
		
	}
	while(1) //不让父进程退出,不然僵尸进程会消失
		sleep(1);
	return 0;
}

 

很明显没有捕获到20个僵尸进程

改进:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
int count=0;
void callback(int sig){
//	printf("触发 %d 信号\n",sig);
while(1){
	//当回收成功后,再收一次,直到回收失败
	//=-1,没有僵尸进程,也没有子进程
	//=0,没有僵尸进程,但是有子进程

	pid_t wpid =wait(0);
	if(wpid<=0)
		break;
	printf("%d  wpid=%d\n",++count,wpid);
}
}
int main(int argc, const char *argv[])
{
	//捕获17号信号
	if(signal(SIGCHLD,callback)==SIG_ERR){
		perror("signal");
		return -1;
	}
	printf("17号信息捕获成功\n");
	int i=0;
	while(i<20){
		if(fork()==0)//子进程
		{
			exit(0);//退出
		}
		i++;//只有父进程会执行i++
		
	}
	while(1)
		sleep(1);
	return 0;
}

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

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

相关文章

vulhub中Weblogic SSRF漏洞复现

Weblogic中存在一个SSRF漏洞&#xff0c;利用该漏洞可以发送任意HTTP请求&#xff0c;进而攻击内网中redis、fastcgi等脆弱组件。 访问http://your-ip:7001/uddiexplorer/&#xff0c;无需登录即可查看uddiexplorer应用。 SSRF漏洞测试 SSRF漏洞存在于http://your-ip:7001/ud…

魅族录屏功能在哪里?这篇文章告诉你答案

“魅族录屏功能在哪里&#xff1f;作为一名魅族手机的新用户&#xff0c;我对这款手机非常满意。然而&#xff0c;最近我在工作中需要用到录屏功能&#xff0c;却找不到如何开启的方法。想请教各位魅族手机的达人们&#xff0c;能否分享一下录屏功能的开启方法&#xff1f;非常…

Android studio Gradle下载失败,如何手动配置解决该问题详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 今天在打开公司一个项目时&#xff0c;突然要重新下载相关的gradle&am…

JWT实战之升级Java JWT

概述 关于JWT的基础概念&#xff0c;如JWT组成部分&#xff0c;以及入门实战&#xff0c;如&#xff1a;如何生成Token、如何解析Token、怎么加入自定义字段等&#xff0c;可参考JWT入门教程。 如前文提到的blog所述&#xff0c;大多数公司都会使用如下&#xff08;版本&…

C#,入门教程(26)——数据的基本概念与使用方法

上一篇: C#,入门教程(25)——注释(Comments)你会吗?看多图演示,学真正注释。https://blog.csdn.net/beijinghorn/article/details/124681888 本文所述的知识基本上适用于C/C++,java等其他语言。 数据是程序的基础,算法是程序的栋梁。 徒弟们交作业的之后,一般都会有…

【Sql】数据库的三范式?MySQL数据库引擎有?InnoDB与MyISAM的区别

目录 数据库的三范式&#xff1f; MySQL数据库引擎有&#xff1f; InnoDB与MyISAM的区别 数据库的三范式&#xff1f; 第一范式&#xff1a;是数据库最基本的要求&#xff0c;列不可再分 第二范式&#xff1a;行可以唯一区分&#xff0c;主键约束 第三范式&#xff1a;是在…

【io.net】问题汇总

【io.net】问题汇总 大家最近挖挖的如火如荼&#xff0c;可是不论是社区活动积分和参与挖矿积分&#xff0c;大家遇到了很多类似问题&#xff0c;重复解决。 因此我这里整理了一下常见的相关问题&#xff0c;大家可以一站式找到解决方案。解决方案主要分为运营和挖矿两个两面…

【CMake G++ GCC】在 Linux 环境中编译 C++ 源码

在 Linux 环境中编译 C 源码 C 技术栏 文章演示了在 乌班图 环境下编译mathematical-expression-cpp 动态库源码,&#xff01; 目录 文章目录 在 Linux 环境中编译 C 源码目录介绍前置准备apt 更新下载并进入源码包 开始编译源码包修改 CMakeList 文件开始进行 makeFile 的生…

AIGC——ConsiStory无需训练LoRA快速实现主题一致地文本到图像生成技术

简介 当前的图像生成技术大多数采用随机采样&#xff0c;这导致每次生成的图像都有所不同&#xff0c;特别是在生成连续图像时难以保持一致性。 举例来说&#xff0c;尝试用AI生成一组图像连环画时&#xff0c;即使使用相似的提示词&#xff0c;也难以达到理想效果。 尽管DA…

7-18 两个数的简单计算器

本题要求编写一个简单计算器程序&#xff0c;可根据输入的运算符&#xff0c;对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。 输入格式&#xff1a; 输入在一行中依次输入操作数1、运算符、操作数2&#xff0c;其间以1个空格分隔。操作数的数…

嵌入式学习第二十七天!(TCP并发模型)

TCP并发模型&#xff1a; 1. TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够实现的并发量比较有限。 2. IO模型&#xff1a; 1. 阻塞IO&#xff1a; 没有数据到来时&#xff0c;可以让任务挂起&#xff0c;节省CPU资源开销&#xff0c;提…

C# MES通信从入门到精通(1)——串口传输文件

前言: 在上位机软件开发领域,有一些工厂的mes系统需要我们通过串口发送文件的方式把一些图片或者检测数据csv文件等发送给服务器,这种方式是一些比较旧的工厂采用的方式,但是这种方式也是存在的,本文就是讲解如何使用串口发送文件详情见下文。 1、串口发送文件思路 将需…

Python-Pong-Game

我还加了音效&#xff0c;类似于小时候游戏机上的弹球游戏 import os import turtle import pygame#初始化pygame pygame.init()#加载声音文件 bounce_sound pygame.mixer.Sound("bounce.mp3")wn turtle.Screen() wn.title("Pong by ") wn.bgcolor(&qu…

docker学习进阶篇

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

幻兽帕鲁游戏服务器多少钱?2024最新报价单请查收

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

《深入Linux内核架构》第1章 简洁和概述

目录 1.1 内核的任务 1.2 实现策略 1.3 内核的组成部分 ​编辑1.3.1 进程、进程切换、调度 1.3.2 UNIX 进程 1.3.3 地址空间和特权级别 1.3.4 页表 1.3.5 物理内存的分配 1.3.6 计时 1.3.7 系统调用 1.3.8 设备驱动程序 1.3.9 网络 1.3.10 文件系统 1.3.11 模块和…

java guide 八股

Java语言特点 简单易学、面向对象&#xff08;继承、封装、多态&#xff09;、平台无关性&#xff08;Java虚拟机jvm&#xff09;、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存 JVM&#xff1a;Java虚拟机&#xff08;跨平台的关键&#xff09; JRE&#xff…

ROS——其他ROS版本安装

1.2.6 资料:其他ROS版本安装 我们的教程采用的是ROS的最新版本noetic&#xff0c;不过noetic较之于之前的ROS版本变动较大且部分功能包还未更新&#xff0c;因此如果有需要(比如到后期实践阶段&#xff0c;由于部分重要的功能包还未更新&#xff0c;需要ROS降级)&#xff0c;也…

Spring Cloud集成nacos配置中心

1.添加Nacos Config依赖 打开nacos-config-demo的pom.xml文件并添加以下两个依赖项 项目的配置文件中通常包括数据库连接配置项、日志输出配置项、Redis连接配置项、服务注册配置项等内容&#xff0c;如spring-cloud-alibaba-nacos-config-base-demo项目中就包含数据库连接配置…