孤儿进程和僵尸进程
进程 僵尸 孤儿
2023-06-13 09:16:13 时间
linux基础
僵尸进程
当进程exit()退出之后,他的父进程没有通过wait()系统调用回收他的进程描述符的信息,该进程会继续停留在系统的进程表中,占用内核资源,这样的进程就是僵尸进程。
#include <unistd.h>
#include <stdio.h>
int main ()
{
/*fpid表示fork函数返回的值,fork会返回两次,
一次是父进程,返回值是子进程的Pid,在子进程会返回0*/
pid_t fpid;
fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程
if (fpid < 0)
printf("fork error!");
else if (fpid == 0) { //
printf("child id is %dn",getpid());
sleep(30);//睡眠30s,在父进程之前退出
printf("child finally...");
}
else { //父进程
printf("parent id is %dn",getpid());
sleep(60);
printf("parend finally...");
}
}
孤儿进程
当一个进程正在运行时,他的父进程忽然退出,此时该进程就是一个孤儿进程。作为一个进程,需要找到一个父进程,否则这种进程在退出之后没人回收他的进程描述符,空耗内存。此时该进程会找到一个父进程,如果自己所在的进程组没人收养,那就作为init进程的子进程。
#include <unistd.h>
#include <stdio.h>
int main ()
{
/*fpid表示fork函数返回的值,fork会返回两次,
一次是父进程,返回值是子进程的Pid,在子进程会返回0*/
pid_t fpid;
fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程
if (fpid < 0)
printf("fork error!");
else if (fpid == 0) { //
printf("child id is %dn",getpid());
sleep(100);
}
else { //父进程
printf("parent id is %dn",getpid());
sleep(30);//睡眠30s,在子进程之前退出
printf("parend finally...");
}
}
处置方式
孤儿进程会由init进程收养作为子进程,所以不会有什么危害;僵尸进程会占用进程号,以及未回收的文件描述符占用空间,如果产生大量的僵尸进程,将会导致系统无法分配进程号,说明父进程的代码编写有问题。
$ ps -aux|grep Z 在理想情况下,可以通过kill命令将进程杀死该进程的父进程来结束僵尸进程。当然也要结合具体场景来对待。
相关文章
- Python升级之路( Lv15 ) 并发编程三剑客: 进程, 线程与协程
- 02_Linux基础-文件系统层次结构-提示符-进程-命令格式-隐藏文件-通配符-绝对相对路径-{1..100}-ls-mkdir-其他基础命令
- 进程处于挂起状态表示_挂起进程转换图
- 详解僵尸进程与孤儿进程
- 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )
- python多进程编程-进程通信之Manager
- Linux中的空闲进程:理解与使用(idle进程linux)
- 进程Linux下查看终端进程的方法(linux查看终端)
- Linux下查找端口对应进程的方法(linux查找端口进程)
- 如何快捷高效地杀死linux僵尸进程(linux杀死僵尸进程)
- 在Linux下如何避免僵尸进程(linux避免僵尸进程)
- 解决Oracle修改进程数的方法(oracle修改进程数)
- Linux中如何处理僵尸进程(linux中僵尸进程)
- Linux系统下进程流量监控的实现(linux 进程流量监控)
- Linux下使用exec函数实现进程自我替换(exec函数 linux)
- Oracle进程“僵尸”究竟是何方妖怪?(oracle 僵尸进程)
- 深入Linux环境中寻找僵尸进程(linux查找僵尸进程)
- 借助多进程实现Redis队列的灵活操作(多进程操作redis队列)