为什么这个使用 fork 和共享内存的 C 程序的输出是这样的?

Why the output of this C program that uses fork and shared memory like that?

我有一个旧考试的问题,给定一个 C 代码并且 m 是全局变量,当程序完成 m 的值时,答案是 "between 7 and 19" 但我不明白为什么,有人可以向我解释为什么答案在 7-19 之间而不是 19 之间。

int m = 0;

int main() {
    int i;

    fork();
    m=3;
    fork();
    for(i=0;i<4;i++)
        m++;
}

首先要注意的是,分析这个问题是没有阻塞调用,这意味着当主进程到达main结束时程序就会结束,而不管其他进程处于什么状态。

利用这个事实我们可以计算出 m 的下限:这将是在主进程退出之前分叉进程不更改 m 的值。在这种情况下,m 将从 3 开始,并在循环中添加到 4 次,从而得到 m = 7.

的下限

当所有进程在任何进入循环之前都已经产生时,上限将发生,然后每个进程将 4 添加到 m(其起始值为 3)。换句话说,m = 3 + N*4 其中 N 是生成的进程总数。

因此,为了最终获得上限,我们需要知道生成了多少个进程。第一次调用 fork() 会将一个进程变成两个,随后调用 fork() 会将这些进程中的每一个都变成两个,这意味着 N = 4.

使用之前的 m 表达式,我们看到上限是 m = 3 + 4 * 4 = 19