孤儿进程
什么是孤儿进程
孤儿意味着什么?提到孤儿,首先想到的肯定是父母双亡。现实情况是,一般孤儿(未成年)都要被福利院或者领养人收养。计算机一般都是现实世界的抽象,同样,linux中的孤儿进程和被收养的孤儿有着异曲同工之意。
linux中,父进程通过fork()函数生成子进程,如果在子进程还没结束之前,父进程由于各种原因终止了,这时候,子进程父母双亡,被1号进程(init进程)领养人收养,子进程就成为了孤儿进程。此时查看子进程的父进程,就变成了init进程(1号进程)。
实例讲解
下面用一个例子来说明孤儿进程。
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork error");
exit(1);
}
else if (pid == 0) // child process
{
printf("child process %d, parent process %d\n", getpid(), getppid());
sleep(5);
printf("parent process died now\n");
printf("child process %d, parent process %d\n", getpid(), getppid());
exit(0);
}
else // parent process
{
printf("parent process %d\n", getpid());
sleep(1);
printf("parent process closed now.\n");
exit(0);
}
return 0;
}
编译和运行程序,如下:
/source/orphan# gcc orphan.c -o orphan
/source/orphan# ./orphan
parent process 10272
child process 10273, parent process 10272
parent process closed now.
/source/orphan# parent process died now
child process 10273, parent process 1
^C
简要说明下程序。
先fork生成一个子进程。
如果fork调用失败,直接返回错误码和错误信息。
从运行例子可以看出,fork成功后,子进程10273,父进程10272。
然后我们让父进程先于子进程终止。由于fork后父子进程的运行顺序是不确定的,此时我们让父进程sleep1秒,子进程sleep5秒,确保父进程先执行exit从而终止运行。
此时,子进程10273的父进程已经变为1号进程了。