【问题标题】:In C programming language, how can variable store two values? [duplicate]在 C 编程语言中,变量如何存储两个值? [复制]
【发布时间】:2015-05-15 05:48:03
【问题描述】:

我决定学习 C,这是我使用的其中一本书中的 sn-p:

#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?

【问题讨论】:

  • 系统调用fork()用于创建进程。它不接受任何参数并返回一个进程 ID。

标签: c linux ipc multitasking


【解决方案1】:

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

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

事实上,fork 文档专门涵盖了以下内容:

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

因此,您可以使用来自fork 的返回值(就像您所做的那样)来查看您是父母还是孩子(并查看它是否正常工作,如果失败,它将返回-1 并且你将成为有没有个孩子的父母)。

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

【讨论】:

  • 加上关键字“...它不是同一个变量”。
【解决方案2】:

一个变量一次只能保存一个值。您所看到的正在发生,因为fork() 正在创建另一个进程:现在您的程序有两个实例正在运行;一个是result == 0(衍生进程),另一个是result != 0(原始进程)

【讨论】:

    【解决方案3】:

    fork 从父级复制一个子级。所以新创建的子节点继承了父节点的一些属性,如共享内存、消息队列、文件流等。因此,当您调用fork 时,会创建另一个具有另一个变量结果的进程。

    【讨论】:

      【解决方案4】:

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

      来自手册页:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-06
          • 2016-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多