首页 > 解决方案 > 输出将如何打印?

问题描述

我正在对这段代码进行一些跟踪,并以打印 4 条语句结束,2 条用于父母,2 条用于儿童,但我想知道订单如何?我知道这取决于 CPU,它可能因一台计算机而异,但可能的解决方案是什么?因为我想到了这些语句可能会出现 6 种不同的顺序。

#include <stdio.h>
#include <sys/types.h> #include <unistd.h>

void forkExample()
{
    int z = 8;

    if (fork() == 0)
    {
        fork();
        printf("Child with z = %d\n", ++z);
    }
    else
    {
        fork();
        printf("Parent with z = %d\n", --z);
    }
}

int main()
{
    forkExample(); return 0;
}

标签: clinuxubuntufork

解决方案


任何调用之间都没有顺序printf——代码中的任何内容都不会导致任何进程中的任何调用出现在任何其他调用之前或之后。因此,任何 4! = 24 个订单是可能的。

(这假设每个输出都在另一个输出开始之前完全打印。C 或 Posix/Unix 不能保证这一点,但可能是使用默认缓冲区设置的短文本。)

虽然可以对实际调用进行 24 次排序,但有些消息无法区分,因为它们打印相同的文本。有两对相同的消息,所以可区分结果的数量是 24/2!/2! = 6。


推荐阅读