linux中的孤儿进程

介绍

父子进程之间的关系会出现孤儿进程与僵死进程;

  • 僵死进程为父进程还没有结束,子进程结束了自己行程,可能是正常结束也可能是因为某些意外而结束,其中可以通过wait或者waitpid查看其原因,在前面几篇文章中有所介绍;
  • 孤儿进程则与之相反,即为父进程结束了自己的行程——正常结束或者异常退出,但子进程还依旧存在,此时子进程的父进程的pid则为1。内核会将孤儿进程的父进程设置为1;

孤儿进程

因为进程之间的内容是相互独立的,因此对于程序来说孤儿进程的伤害并不大;只不过是占用相关的内存和CPU利用而已;
在前文中,主要展示的都为僵尸进程,本文主要代码展示的为孤儿进程的内容。

  • 创建进程
  • 父进程用一段时间休眠,用于子进程显示其父进程的pid
  • 子进程用一段时间休眠,用于父进程正常结束,并显示其僵尸进程的父进程
#include <iostream>
#include <unistd.h>
using namespace std;

int main()
{
    pid_t p = fork();
    if(p < 0)
    {
        cout<<"error"<<endl;
        exit(1);
    }
    else if(p == 0)
    {
        // 子进程
        cout<<"I am son process mypid = "<<getpid()<<" my father pid="<<getppid()<<endl;
        sleep(5); // 用于父进程结束之后显示
        cout<<"I am son process mypid = "<<getpid()<<" my father pid="<<getppid()<<endl;
    }
    else
    {
        cout<<"I AM FATHER PROCESS MYpid = "<<getpid()<<" MYSONPID = "<<p<<endl;
        sleep(1); // 用于子进程可以显示父进程
        cout<<"FATHER DESTROY"<<endl;
    }
    return 0;
}

具体展示,可以看到子进程显示的父进程为其pid = 1;

➜  aloneFork ./a.out
I AM FATHER PROCESS MYpid = 23907 MYSONPID = 23908
I am son process mypid = 23908 my father pid=23907
FATHER DESTROY
➜  aloneFork I am son process mypid = 23908 my father pid=1

版权声明:本文为So_Band原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。