一般情况下,子进程是由父进程创建,而子进程和父进程的退出是无顺序的,两者 之间都不知道谁先退出。正常情况下父进程先结束会调用wait或者 waitpid 函数 等待子进程完成再退出,而一旦父进程不等待直接退出,则剩下的子进程会被 init(pid=1)进程接收,成会孤儿进程。(进程树中除了 init 都会有父进程)。
给子进程设置sleep(10),保证父进程先退出。
//孤儿进程 #include#include #include #include #include #include using namespace std; int main() { //创建子进 pid_t pid = fork(); if(pid<0) //fork失败的情况 { perror("fork error"); return -1; } else if(pid>0)//父进程 { cout << "father:[pid]=" << getpid() << "[fpid]=" << getppid() << endl; } else if(pid==0) //子进程 { sleep(10);//保证父进程先退出 cout << "child:[pid]=" << getpid() << "[fpid]=" << getppid() << endl; } return 0; }
执行后我们发现子进程的FPID不再是创建它的子进程变成了一个别的id;被别人领养但并非init(pid=1)进程;原因如下:
原来 upstart 是init 演进来的,可以说是一种新型的 init系统,传统的 sysvinit 已经淡出历史舞台,新系统 UpStart 和 systemd 各有特点,而越来越多的 Linux 发行版采纳了 systemd。ubuntu 较新的发行版都用 upstart 代替 init 来收养孤儿进程。
完结!!!!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)