Linux系统运维之Linux基础孤儿进程与僵死进程
白羽 2018-07-11 来源 :网络 阅读 1225 评论 0

摘要:本文将带你了解Linux系统运维之Linux基础孤儿进程与僵死进程,希望本文对大家学Linux有所帮助。


孤儿进程:

因父亲进程先退出而导致一个子进程被 init 进程收养的进程为孤儿进程,即孤儿进程的父亲更改为 init 进程,该进程在孤儿进程退出后回收它的内核空间资源。

僵死进程:

进程已经退出,但它的父亲进程还没有回收内核资源的进程为僵死进程,即该进程在内核空间的 PCB(进程控制块) 没有释放。

1.以下是一个孤儿进程的示例程序,在此程序中,让父进程先退出,然后子进程再次输出自己的父亲进程号:

#include <stdio.h>#include <unistd.h>

int main()

{

    int pid;

 

    if((pid = fork()) == -1)

        perror("fork Err");

    else if(!pid){

        printf("Child: pid : %d, ppid : %d \n", getpid(), getppid());

        sleep(2);

        printf("Child: pid : %d, ppid : %d \n", getpid(), getppid());

}

    else{

        sleep(1);

        printf("Parent: pid : %d, ppid : %d \n", getpid(), getppid());

}

 

    return 0;

}

运行结果如下:

从结果来看,子进程的父进程前后发生了变化。

2.以下是僵死进程的示例程序,在此程序中,父进程让子进程退出但不处理,然后父进程调用 system 函数列出当前前台进程信息,代码如下:

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

int main(){

    int pid;

 

    if((pid = fork()) == -1)

        perror("fork err");

    else if(!pid){

        exit(0);

}

    sleep(1);

    system("ps");

 

    return 0;

}

运行结果如下:

红框的进程即为僵死状态。

怎样来清除僵尸进程:

1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

wait()与waitpid()

wait():

调用 wait() 函数的父亲进程将阻塞式等待该进程的任意一个子进程结束后,回收该子进程的内核进程资源。

waitpid():

waitpid()函数可以用来等待指定子进程(指定PID的子进程)结束。函数声明如下:

可以通过 /proc/{pid}/maps 文件查看进程资源。

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标系统运维之Linux!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程