首页 > 解决方案 > 理解 C 中的 fork() 顺序

问题描述

所以我有这个程序我试图理解,它来自一个旧的考试,但我无法掌握它。我如何知道分叉的顺序以及变量如何更改?

static int g = -1;

int main(int argc, char *argv[])
{
    int v = 0;
    pid_t p;

    while (v++ < 6)
        if ((p = fork()) < 0) {
            perror("fork error");
            return 1;
        } else if (p == 0) {
            v++;
            g--;
        } else {
            g++;
            v+=3;
        if (waitpid(p, NULL, 0) != p) {
            perror("waitpid error");
            return 1;
        }
    }
    printf("mypid = %d parentpid = %d p = %d v = %d g = %d\n",
    getpid(), getppid(), p, v, g);
    return 0;
}

标签: cunixforkposix

解决方案


对 fork 的每次调用都会使用自己的变量生成自己的进程,这些变量在调用时被复制(逻辑上;当实际复制发生时优化可能会改变,但不会改变结果)。

所以当你进入循环时,v 会递增到 1,然后你 fork。此时父进程有 g=-1, v=1, p= 而新子进程有 g=-1, v=1, p=0。然后父级进入 else 情况,将 g 增加到 0 和 v 到 4,然后等待子级完成,而子级进入“else if (p == 0)”,将 v 增加到 2,减少 g到-2,然后再次循环。

从那里开始,您现在希望获得足够的信息来遵循逻辑,因为接下来的两个子进程被分叉,完成循环并打印它们各自的结果。当他们这样做时,第一个孩子也将以 v=6 到达其 waitpid 的末尾,退出循环并打印其结果。

此时,父级将解除阻塞,再绕循环一次(沿途再分叉一个子级),然后(一旦该子级完成)退出循环。


推荐阅读