2

我试图在运行命令pid后打印进程。fork()这是我的代码-

#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如何获得这个值?

4

1 回答 1

7

父级在子级执行其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;
}
于 2015-09-26T10:06:07.923 回答