linux僵尸进程详解(代码片段)

流楚丶格念 流楚丶格念     2022-12-07     626

关键词:

僵尸进程概念

在 unix/linux 中,正常情况下,子进程是通过父进程创建的。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。当一个进程完成它的工作终止之后,它的父进程需要调用 wait()
或者 waitpid()系统调用取得子进程的终止状态。

僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死(zombie)进程。

僵尸进程问题及危害

unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到。

这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。

但是仍然为其保留一定的信息(包括进程号 the process ID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process 等)。直到父进程通过 wait / waitpid 来取时才释放。

但这样就导致了问题,如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

实现一个僵尸进程

详细内容请移驾另一篇博客:
https://yangyongli.blog.csdn.net/article/details/118738169

僵尸进程处理

我们知道僵尸进程是不能通过 kill 命令来终止的,想要处理系统中的僵尸进程,只能找到产生僵尸进程的父进程,使用 kill 命令终止父进程即可。此时僵尸进程成为孤儿进程,会被 init 进程接管,调用 wait 函数释放资源。

僵尸进程的预防

(1)通过信号机制

子进程退出时向父进程发送 SIGCHILD 信号,父进程处理 SIGCHILD 信号。
在信号处理函数中调用 wait 进行处理僵尸进程。测试程序如下所示

通过信号量及时发现了僵尸进程并处理了。
在这里插入图片描述

/*************************************************************************
    > File Name: main.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2021年07月14日 星期三 21时54分29秒
 ************************************************************************/

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

static void sig_child(int signo);

int main()

	pid_t pid;
	//创建捕捉子进程退出信号
	signal(SIGCHLD, sig_child);
	pid = fork();
	if (pid < 0)
	
		perror("fork error:");
		exit(1);
	
	else if (pid == 0)
	
		printf("I am child process,pid id %d.I am exiting.\\n",getpid());
			exit(0);
	
	printf("I am father process.I will sleep two seconds\\n");
	//等待子进程先退出
	sleep(2);
	//输出进程信息
	system("ps -o pid,ppid,state,tty,command");
	printf("father process is exiting.\\n");
	return 0;


static void sig_child(int signo)

	pid_t pid;
	int stat;

	//处理僵尸进程
	while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)
		printf("child %d terminated.\\n", pid);


(2)Fork 两次

《Unix 环境高级编程》8.6 节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为 init 进程,通过 init 进程可以处理僵尸进程。测试程序如下所示:

在这里插入图片描述

/*************************************************************************
    > File Name: main.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2021年07月14日 星期三 22时08分39秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()

	pid_t pid;
	//创建第一个子进程
	pid = fork();
	if (pid < 0)
	
		perror("fork error:");
		exit(1);
	
	//第一个子进程
	else if (pid == 0)
	
		//子进程再创建子进程
		printf("I am the first child process.pid:%d\\tppid:%d\\n", getpid(), getppid());
		pid = fork();
		if (pid < 0)
		
			perror("fork error:");
			exit(1);
		
		//第一个子进程退出
		else if (pid > 0)
		
			printf("first procee is exited.\\n");
			exit(0);
		
		//第二个子进程
		//睡眠 3s 保证第一个子进程退出,这样第二个子进程的父亲就是 init 进程里
		sleep(3);
		printf("I am the second child process.pid: %d\\tppid:%d\\n", getpid(), getppid());
		exit(0);
	
	//父进程处理第一个子进程退出
	if (waitpid(pid, NULL, 0) != pid)
	
		perror("waitepid error:");
		exit(1);
	
	exit(0);
	return 0;


linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解(代码片段)

Linux——进程概念、进程创建、僵尸进程、孤儿进程、环境变量、程序地址空间详解进程概念进程基本概念查看进程进程创建进程状态僵尸进程孤儿进程守护进程环境变量程序地址空间内存管理进程概念进程基本概念从用户角度&... 查看详情

linux入门进程概念(超详解,建议收藏)(代码片段)

...行状态S睡眠状态D磁盘休眠状态T暂停状态X死亡状态&Z僵尸状态6️⃣僵尸进程僵尸进程的危害如何避免僵尸进程6️⃣孤儿进程7️⃣进程优先级基本概念查看系统进程PIRandNI查看进程的优先级用top命令更改已存在的进程的nice附... 查看详情

linux入门进程概念(超详解,建议收藏)(代码片段)

...行状态S睡眠状态D磁盘休眠状态T暂停状态X死亡状态&Z僵尸状态6️⃣僵尸进程僵尸进程的危害如何避免僵尸进程6️⃣孤儿进程7️⃣进程优先级基本概念查看系统进程PIRandNI查看进程的优先级用top命令更改已存在的进程的nice附... 查看详情

[os-linux]详解linux的进程1(进程概念pcb进程创建,进程状态,僵尸进程,孤儿进程)(代码片段)

...程概念,PCB,进程的创建,进程的状态,僵尸进程,孤儿进程。目录一、冯诺依曼体系二、操作系统(OperatorSystem) 三、进程基本概念四、描述进程-PCB1.task_struct五、组织进程六、查看进程七、通过系统调 查看详情

linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解(代码片段)

Linux——进程概念、进程创建、僵尸进程、孤儿进程、环境变量、程序地址空间详解进程概念进程基本概念查看进程进程创建进程状态僵尸进程孤儿进程守护进程环境变量程序地址空间内存管理进程概念进程基本概念从用户角度&... 查看详情

linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解(代码片段)

Linux——进程概念、进程创建、僵尸进程、孤儿进程、环境变量、程序地址空间详解进程概念进程基本概念查看进程进程创建进程状态僵尸进程孤儿进程守护进程环境变量程序地址空间内存管理进程概念进程基本概念从用户角度&... 查看详情

linux提高:僵尸进程(代码片段)

文章目录题目代码知识回顾题目代码实现一个僵尸进程代码实现僵尸进程,只需让子进程先于父进程结束,并且父进程不调用wait/waitpid函数回收子进程的退出状态。在父进程没有退出的转态下使用ps命令即可查看存在的僵尸进程信... 查看详情

linux提高:僵尸进程(代码片段)

文章目录题目代码知识回顾题目代码实现一个僵尸进程代码实现僵尸进程,只需让子进程先于父进程结束,并且父进程不调用wait/waitpid函数回收子进程的退出状态。在父进程没有退出的转态下使用ps命令即可查看存在的僵尸进程信... 查看详情

linux命令psaux|grepxxx详解(代码片段)

...进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的.ps为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果... 查看详情

php中的僵尸进程孤儿进程详解(代码片段)

僵尸进程当子进程运行结束,父进程仍然继续运行,但父进程没有对子进程进行回收,释放子进程占用的资源,此时子进程就成为了一个僵尸进程。在Unix进程管理中,如果新开的子进程运行结束,父进程将会收到一个SIGCHLD信号... 查看详情

如何找到并杀掉linux系统中的僵尸进程(代码片段)

这是一个关于如何寻找Linux系统僵尸进程并杀死它们的小知识。你也可以从中了解到关于进程和僵尸进程的一些知识。在了解僵尸进程之前,让我们来复习一下什么是Linux进程。简而言之,进程是一个程序的运行实例。它... 查看详情

linux下进程以及相关概念理解(代码片段)

...、进程状态运行状态R睡眠状态S磁盘休眠状态D暂停状态T僵尸状态Z死亡状态X五、僵尸进程与孤儿进程5.1僵尸进程5.1.1僵尸进程的概念5.1.2僵尸进程的危害5.2孤儿进程六、进程地址空间6.1进程地址空间的验证6.2 感知进程地址空间6.3... 查看详情

《linux从0到99》六进程概念下(代码片段)

进程概念下1.僵尸进程01僵尸进程的概念03解决僵死状态/僵尸进程04僵尸进程的模拟实现05僵尸进程的危害2.孤儿进程01孤儿进程的概念02孤儿进程的模拟实现03孤儿进程的危害3.进程优先级01PRIandNI02PRIvsNI查看进程优先级的命令4.环境... 查看详情

linux进程概念(精讲)(代码片段)

...状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X僵尸进程僵尸进程的危害孤儿进程进程优先级基本概念查看系 查看详情

linux进程概念(精讲)(代码片段)

...状态运行状态-R浅度睡眠状态-S深度睡眠状态-D暂停状态-T僵尸状态-Z死亡状态-X僵尸进程僵尸进程的危害孤儿进程进程优先级基本概念查看系 查看详情

linux信号详解:signal与sigaction函数

...,本文将通过若干例子帮助读者增进对于它的了解。一、僵尸进程(ZombieProcess)与信号屏蔽(忽略)僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程... 查看详情

linux--进程(代码片段)

...系统调用创建进程-fork初识进程状态进程状态查看Z(zombie):僵尸进程echo$?僵尸进程的危害孤儿进程进程优先级查看系统进程PRI和NI查看进程优先级的命令其他概念冯诺依曼体系系统我们常 查看详情

linux信号详解:signal与sigaction函数1

...,本文将通过若干例子帮助读者增进对于它的了解。一、僵尸进程(ZombieProcess)与信号屏蔽(忽略)僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程... 查看详情