fork()返回0,但子进程getpid()!= 0.为什么?

Di *_*ang -3 c fork pid process wait

这是测试fork()系统调用的C代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<wait.h>

int main(int argc, char *argv[])
{

    printf("I am: %d\n", (int)getpid());

    pid_t pid = fork();

    printf("fork returned: %d\n", (int)pid);

    if (pid < 0)
    {
        perror("fork failed");  
    }

    if (pid==0)
    {
        printf("I am the child with pid %d\n", (int)getpid());
        sleep(5);
        printf("Child exiting...\n");
        exit(0);
    }

    printf("I am the parent with pid %d, waiting for the child\n", (int)getpid());
    wait(NULL);
    printf("Parent ending. \n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

终端输出是:

I am: 25110
fork returned: 25111
I am the parent with pid 25110, waiting for the child
fork returned: 0
I am the child with pid 25111
Child exiting...
Parent ending. 
Run Code Online (Sandbox Code Playgroud)

问题:当fork返回时:0,它在子进程中.但是孩子的过程显示我是pid 25111的孩子.我以为子进程pid应为0,为什么它变为25111?

与父进程相同,fork返回25111,但getpid()返回25110(我是pid 25110的父亲,等待孩子)

Ste*_*mit 7

子进程显示我是pid 25111的孩子.我认为子进程pid应为0

不.在父母中fork()返回孩子的pid.在孩子中,fork返回0 - 这不是任何东西的pid,它只是一个标记.正如getpid告诉你的,孩子的pid是25111 .

使用父进程,fork返回25111,但getpid()返回25110

对.正如getpid告诉你的那样,父母的pid总是25110 .并fork()归还了新孩子的pid.

在子fork节点中getpid返回的父节点返回相同值的事实证明这一切都正常工作.

听起来你觉得fork()总是会回到你所处的过程的pid.但这没有意义 - 我们已经有了这个getpid要求.

如果您是父级,则fork()返回另一个进程的pid ,即子级.如果你是孩子,fork()根本不会回来.(如果你是孩子而且你想知道你父母的pid,这是一个好的,频繁的,单独的问题.答案:打电话getppid().)

我们可以总结如下:

                 parent   child
                 ------   -----
pid:              25110   25111
fork returns:     25111       0
getpid returns:   25110   25111
getppid returns:  ?????   25110
Run Code Online (Sandbox Code Playgroud)

记住这一点的方法是考虑将要调用的代码fork():它将要做什么,需要知道什么.父母需要知道它是父母.孩子需要知道这是孩子.父母经常需要知道孩子的pid(并且没有其他方法可以获得它).

如果fork总是返回一个pid,那么在fork通话之后,查看它的返回值,你将无法知道你是父母还是孩子 - 但这通常是你需要知道的第一个也是最重要的事情.

(在所有这些中,我忽略了第三种可能性,即fork失败,并在父项中返回-1,并且不返回子项中的任何内容,因为没有.)

另请参见为什么fork()在子进程中返回0?.