前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UNIX(进程间通信):04---孤儿进程

UNIX(进程间通信):04---孤儿进程

作者头像
用户3479834
发布2021-02-03 15:49:00
5750
发布2021-02-03 15:49:00
举报
文章被收录于专栏:游戏开发司机游戏开发司机

上一篇文章讲过僵尸进程,这里再分享给大家另外一种状态。

孤儿进程

什么是孤儿进程? 当一个子进程还在执行时,它的父进程已经退出了,那么这个子进程的退出信息也没有被父进程接收到,如果子进程的退出信息没有被别的进程接收到,那么这个子进程就会变成一个僵尸进程,所以孤儿进程可能会引发僵尸进程。所以这个子进程必须被其他进程所领养,领养它的进程为1号进程,则它的退出信息会被1号进程所接收。 如果父进程退出,父进程会变成僵尸进程吗? 不会,因为父进程的父进程为bash,父进程的退出信息会由bash接收到,这些我们看不到。

我们这里再重温下僵尸进程和孤儿进程:

僵尸进程:

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。

这种进程称之为僵死进程。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

孤儿进程有什么危害?

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

如何创建孤儿进程?

创建一个孤儿进程(只需要让父进程先退出,子进程继续执行)

代码语言:javascript
复制
#include<stdio.h> 
#include<unistd.h>
#include<stdlib.h>

int main()
{
//孤儿进程:父进程先退出,子进程继续执行
pid_t pid = fork();
if (pid == 0)
{
//子进程
while (1)
{
printf("child pid=%d ppid=%d\n", getpid(), getppid());
sleep(3);
}
}
else if (pid > 0)
{
//parent
printf("parent pid=%d ppid=%d\n", getpid(), getppid());
sleep(5);
exit(1);
}
else
{
perror("fork()");
}
return 0;
}

打开一个监控,由于这里还需要看到父进程的id

执行结果:(我们可以发现5秒之后子进程的父进程变为1号进程,说明当5秒之后父进程退出后,子进程被1号进程领养)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档