0

在阅读一些关于 C 中 fork() 的文章时,我看到了这个我无法理解的示例(下面的代码):

理解问题:我们只运行“if”或“else”,而不是同时运行。但是由于子进程和父进程“同时”运行,在这个例子中我们看到我们都经历了“if”和“else”!尽管它是同时发生的,但实际上并非如此,这取决于哪个进程将首先获得 CPU(对吗?)。

让一切变得“更奇怪”的是,我们可能先经过“else”,然后再经过“if”。这怎么可能 ?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void forkexample()
{
    // child process because return value zero
    if (fork() == 0)
        printf("Hello from Child!\n");
  
    // parent process because return value non-zero.
    else
        printf("Hello from Parent!\n");
}
int main()
{
    forkexample();
    return 0;
}

可能的输出是:

孩子问好!

来自家长的问候!

(或者)

来自家长的问候!

孩子问好!

4

2 回答 2

4

请记住,该fork函数实际上返回了两次:一次使用子进程的 pid 给父进程,一次返回 0 的子进程。

此时,您有两个独立的进程运行相同的代码并打印到同一个终端。由于你有两个进程,内核可以自由地以它认为合适的任何方式调度它们,这意味着任何一个进程的输出都可以以任何顺序出现。

于 2021-07-20T15:48:34.013 回答
2

fork是一个系统调用,它执行以下操作(抽象地说,实际实现可能在现代系统上有所不同):

  • 在内存中创建进程映像的副本并将其设置为具有自己 PID 的进程
  • 在一张图片中(孩子)返回 0
  • 在第二个图像(父级)中返回新进程的 PID
  • 像往常一样安排两个图像的执行

结果,在多核系统上,父母和孩子都将独立执行,没有其他同步,彼此没有任何关系。

如果你观察这两个进程的输出,你会发现它们的输出可以是任何形状或形式——你可以在子输出之前从父输出得到输出,接替它或与它交错——它是无法预测你最终会看到什么。

于 2021-07-20T15:50:05.953 回答