孤儿进程和僵尸进程

news/2025/2/7 3:48:46/

文章目录

  • 孤儿进程
  • 僵尸进程

孤儿进程

定义

  • 父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程(Orphan Process)
  • 每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init 进程会循环地 wait() 它的已经退出的子进程。
  • 孤儿进程并不会有什么危害

program

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main() 
{// 创建子进程pid_t pid = fork();// 判断是父进程还是子进程if(pid > 0) {printf("i am parent process, pid : %d, ppid : %d\n", getpid(), getppid());} else if(pid == 0) {sleep(1);// 当前是子进程printf("i am child process, pid : %d, ppid : %d\n", getpid(),getppid());}// for循环for(int i = 0; i < 3; i++) {printf("i : %d , pid : %d\n", i , getpid());}return 0;
}

运行结果

(base) user@ubuntu:~/Desktop/OS/NiuKe$ gcc -o test test.c -std=c99
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ./test 
i am parent process, pid : 4483, ppid : 3615
i : 0 , pid : 4483
i : 1 , pid : 4483
i : 2 , pid : 4483
(base) user@ubuntu:~/Desktop/OS/NiuKe$ i am child process, pid : 4484, ppid : 1
i : 0 , pid : 4484
i : 1 , pid : 4484
i : 2 , pid : 4484

僵尸进程

定义

子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程僵尸进程实际上是一个已经死掉的进程。

正常进程的退出流程:当一个进程完成时,Linux 内核通过发送SIGCHLD 信号通知它的父进程。然后父进程执行wait()系统调用来读取子进程的状态并获取退出代码。清理结束此进程。

僵尸进程:父进程无法通过调用waitwaitpid得到它的退出状态清除掉这个进程,导致已完成进程的僵尸状态留在进程表中,因此它作为僵尸进程出现在进程列表中。影响可用的进程号从而导致系统不能产生新的进程

创建

program

#include<stdio.h>                                                                                                                               
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>int main(int argc, const char *argv[])
{pid_t pid=fork();//创建子进程if(pid>0){printf("this a little father%d\n",getpid());}else if(pid==0){int i=0;while(i<3){printf("this a little father%d,child:%d\n",getppid(),getpid());i++;}_exit(0);//exit和_exit的区别(刷新缓冲区)}elseperror("fork");return 0;
}

简单编译一波

(base) user@ubuntu:~/Desktop/HTTP/studyFork$ gcc a.c -o a
(base) user@ubuntu:~/Desktop/HTTP/studyFork$ ./a
this a little father3191
this a little father3191,child:3192
this a little father2042,child:3192
this a little father2042,child:3192

linux下查看 ps aux | egrep "Z|defunct"

(base) user@ubuntu:~/Desktop/HTTP/studyFork$ ps aux | egrep "Z|defunct"
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user       3194  0.0  0.0  16180  1116 pts/0    S+   08:18   0:00 grep -E --color=auto Z|defunct

处理僵尸进程

1.唤起父进程,由父进程清理僵尸进程。

根据子进程ID查找父进程的ID

 ps -o ppid= <Child PID>

然后根据查找的父进程删除

kill -s SIGCHLD <Parernt PID>

2.直接杀死父进程

注:杀死父进程会影响其所有子进程

kill -9 <Parernt PID>

http://www.ppmy.cn/news/12587.html

相关文章

修改jupyter notebook默认路径

修改jupyter notebook默认路径jupyter notebook默认打开C:\Users\你的用户名&#xff0c;用户名是你的电脑用户名&#xff0c;upload文件又会在C盘生成一堆文件&#xff0c;很乱&#xff0c;用notebook打开文件还要跳转到目录&#xff0c;很麻烦&#xff0c;那有没有办法呢&…

RESTful的风格提倡 URL 地址使用统一的风格设计

RESTful概念实现REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。资源&#xff1a;资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。资源的表述资源的表…

使用Python创建websocket服务端并给出不同客户端的请求

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 使用Python创建websocket服务端&#xff0c;并给出不同客户端的请求 一、 WebSocket是啥 WebSocket 和HTTP一样&#xff0c;也是一种通…

GPIO 八种工作模式及其硬件框图

参考资料: STM32F1xx 官方资料:《STM32中文参考手册V10》- 第 8 章通用和复用功能 IO(GPIO 和 AFIO) GPIO 是通用输入/输出端口的简称,是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32 的八种 …

JavaScript 浏览器的重排和重绘

文章目录JavaScript 浏览器的重排和重绘概述浏览器解析过程重排重绘优化将多次改变样式的属性操作合并为一次需要多次重排的元素设置为绝对定位减少DOM操作复杂元素处理先设置display为none处理完后再显示缓存频繁操作的属性减少使用table布局使用事件委托绑定事件处理程序利用…

目标检测:特征金字塔网络(Feature Pyramid Network)

目标检测&#xff1a;特征金字塔网络&#xff08;Feature Pyramid Network&#xff09;概述核心思想概述 由于在目标检测任务中&#xff0c;对与大目标的检测&#xff0c;需要feature map每个点的感受野大一点&#xff08;高层语义特征&#xff09;&#xff0c;对于小目标&…

Docker部署Nexus通过Maven推送及拉取代码

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; Docker部署Nexus通过Maven推送及拉取代码⏱️ 创作时间&#xff1a; 2023…

Cookie和Session以及相关的方法

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 Cookie 什么是Cookie? 为什么要用Cookie? Cookie的原理 Session 什么是Session? 为什么要用Session? Session原理 核心方法 实现用户登…