在学习Linux c编程实战的进程控制一章时,书上关于孤儿进程的例子如下:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
pid_t pid;
pid = fork();
int n = 5;
switch(pid){
case 0:
while(n--){
printf("当前为子进程 pid = %d,"
"ppid = %d\n",getpid(),getppid());
sleep(3);
}
break;
case -1:
printf("进程创建失败\n");
exit(-1);
default:
printf("当前为父进程 pid = %d\n",getpid());
}
return 0;
}
按照书上的说法,当一个进程的父进程结束后,其未结束的子进程将被init进程(pid=1)收养,因此程序的输出应该为
当前为父进程 pid = 7154
当前为子进程 pid = 7155 , ppid = 7154
当前为子进程 pid = 7155 , ppid = 1
当前为子进程 pid = 7155 , ppid = 1
当前为子进程 pid = 7155 , ppid = 1
当前为子进程 pid = 7155 , ppid = 1
但是在Ubuntu上实测的结果却是:
(额这个中间的目录名乱入是怎么了…)
从运行结果来看,在进程7155的父进程结束后,孤儿进程被4592收养??为什么??4592是什么鬼??
然后:
查到了4592这个家伙,upstart又是什么鬼东西…..查了一番资料才知道,upstart是Ubuntu使用的用来代替init的东西,它的优点在于更快的启动系统,以及在硬件热拔插的时候启动或者停止相关服务.
而在Ubuntu的图形界面下,孤儿进程会被upstart收养而不是init.