在C编程语言中,变量如何存储两个值?

RdB*_*RdB 0 c linux ipc multitasking

我决定学习C,这是我使用的其中一本书的片段:

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

int main()
{
    pid_t result = fork();

    if (result == -1){
        fprintf(stderr, "Error\n");
        return 1;
    }

    if (result == 0)
        printf("I'm a child with PID = %d\n", getpid());
    else
        printf("I'm a parent with PID = %d\n", getpid());

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

它的输出是:

I'm a parent with PID = 5228
I'm a child with PID = 5229
Run Code Online (Sandbox Code Playgroud)

一切都清楚,但怎么可能是result == 0result != 0在同一时间?看起来这个变量存储了两个值,因为printf指令执行了两次.我知道,那会fork()返回0父亲的PID,但是如何result检查它是否在不同条件下返回true?

pax*_*blo 7

因为它不是同一个变量.当您fork进行处理时,您最终会得到两个完全不同的流程(有关详细信息,请参阅此答案).

因此,result父级中的变量与子级中的变量不同.你所看到的是两个进程,都连接到同一个输出设备,每个进程都写自己的消息.

实际上,fork文档特别涵盖了:

成功时,子进程的PID在父进程中返回,并在子进程中返回0.

所以你可以使用fork(你这样做)的返回值来看看你是父母还是孩子(并且看看它是否也有效,-1如果它失败你将会返回,你将成为没有孩子的父母).

这个想法是父母得到了孩子的进程ID,所以它可以用它做一些事情(比如wait()它完成)并且孩子得到零.子节点总是可以通过调用获取父节点的进程ID getppid().