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

时间:2015-05-15 05:48:03

标签: 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;
}

它的输出是:

I'm a parent with PID = 5228
I'm a child with PID = 5229

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

5 个答案:

答案 0 :(得分:7)

因为它的不是相同的变量。当您fork进程时,您最终会得到两个完全不同的流程(有关详细信息,请参阅this answer)。

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

事实上,fork文档专门涵盖了:

  

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

因此,您可以使用fork的返回值(就像您一样)来查看您是父母还是孩子(并查看它是否也有效,它会返回{ {1}}如果失败,您将成为孩子的父母。

这个想法是父母获得孩子的进程ID,因此它可以用它来做某事(比如-1完成它)并且孩子得到零。通过调用wait(),孩子总是可以获得父母的进程ID。

答案 1 :(得分:3)

变量一次只能包含一个值。您正在看到的是因为fork()正在创建另一个流程:现在有两个程序正在运行;一个result == 0(产生的过程),另一个result != 0(原始过程)

答案 2 :(得分:2)

fork复制来自父母的孩子。因此,新创建的子类从父级继承了共享内存,消息队列,文件流等几个属性。因此,当您调用fork时,会创建另一个具有另一个变量结果的进程。

答案 3 :(得分:2)

fork()功能会创建一个新的进程,在此行之后,您的程序会从该位置拆分为2。因为你需要知道你是哪个进程,如果你是子进程,函数返回0,如果你是父进程,则返回一些pid。

来自手册页:

  

成功时,子进程的PID将在父进程中返回,并且          孩子返回0。失败时,在父级中返回-1,          没有创建子进程,并且正确设置了errno。

答案 4 :(得分:1)

fork()函数将创建一个新进程。在父进程中,fork()将返回子进程的pid,因此“result”变量不会等于0,而在子进程中,fork()只返回0,所以“result”为0。