我的代码是分叉一个进程并打印每个进程的 PID 和 PPID。我原本期望孩子的 PPID 与父母的 PID 相同,但事实并非如此。
我使用的是 Ubuntu 14.04。
#include <stdio.h>
#include <sys/wait.h>
int main(){
int pid;
pid = fork();
if(pid==0){
printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
}
else
printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());
return 0;
}
这是我得到的输出:
I am the parent and my pid is 29229 and my parent id is 27087
I am the child and my parent id is 1135 and my id is 29230
答案1
我的猜测是:父进程在子进程之前返回,子进程变成了孤儿进程。PID 1135 一定是您的用户 init 进程,它成为了该进程的新父进程。(Ubuntu 用户会话中有 2 个子收割机)。
$ ps -ef | grep init
you 1135 ... init --user
如果您希望父母等待其孩子,请使用wait
。你实际上include
已经拥有了:
#include <stdio.h>
#include <sys/wait.h>
int main(){
int pid;
pid = fork();
if(pid == 0)
printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid());
else{
printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid());
wait(NULL);
}
return 0;
}
这将确保父进程不会在子进程之前退出printf
。通过到处插入一些sleep()
调用来查看事情发生的顺序,您可以更清楚地看到这种行为。
有关分收割机的更多信息,看看这里。