Linux基础:孤儿进程与僵死进程

2020-08-27 0 412 百度已收录
孤儿进程:

父亲进程先退出而导致一个子进程被 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;  }  

运行结果如下:
Linux基础:孤儿进程与僵死进程

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

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;  }  

运行结果如下:
Linux基础:孤儿进程与僵死进程

红框的进程即为僵死状态

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

wait():

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

waitpid():

waitpid()函数可以用来等待指定子进程(指定PID的子进程)结束。函数声明如下:
Linux基础:孤儿进程与僵死进程

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2018-02/150772.htm

Linux基础:孤儿进程与僵死进程

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

栗子博客 软件 Linux基础:孤儿进程与僵死进程 https://www.lizi.tw/soft/7745.html

常见问题
  • 1、杰齐1.7仅适用于PHP5.2 2、需Zend支持 3、尽量使用宝塔面板 4、尽量使用Windows 系统,关关对Linux支持不太友好。
查看详情

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

Linux基础:孤儿进程与僵死进程-海报

分享本文封面