我试图在运行fork()
命令后打印进程的pid
。这是我的代码-
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int pid;
pid=fork();
if(pid==0)
printf("I am the child.My pid is %d .My parents pid is %d n",getpid(),getppid());
else
printf("I am the parent.My pid is %d. My childs pid is %d n",getpid(),pid);
return 0;
}
这是我得到的答案-
I am the parent.My pid is 2420. My childs pid is 3601
I am the child.My pid is 3601 .My parents pid is 1910
为什么父母id在第二行不是2420
.为什么我得到1910
我怎么能得到这个值?
父进程在子进程执行printf
调用之前退出。当父进程退出时,子进程将获得一个新的父进程。默认情况下,这是init
进程,PID 1。但是最近的Unix版本增加了进程声明自己为"子收割者"的能力,它继承了所有孤儿。PID 1910显然是您系统上的子收集器。关于这方面的更多信息,请参阅https://unix.stackexchange.com/a/177361/61098。
在父进程中调用wait()
,使其等待子进程退出后再继续。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int pid;
pid=fork();
if(pid==0) {
printf("I am the child.My pid is %d .My parents pid is %d n",getpid(),getppid());
} else {
printf("I am the parent.My pid is %d. My childs pid is %d n",getpid(),pid);
wait(NULL);
}
return 0;
}