C fork()和“fork”\";

C fork()和“fork”\";,c,fork,C,Fork,我只是在C中做了一个简单的演示程序,看看fork()是如何工作的,但遇到了一些我不理解的东西。在本例中: void fork2() { printf("A"); fork(); printf("B"); } void fork2() { printf("A\n"); fork(); printf("B\n"); } 输出为ABAB,但在本例中: void fork2() { printf("A"); fork(); pr

我只是在
C
中做了一个简单的演示程序,看看
fork()
是如何工作的,但遇到了一些我不理解的东西。在本例中:

void fork2()
{
    printf("A");
    fork();
    printf("B");
}
void fork2()
{
    printf("A\n");
    fork();
    printf("B\n");
}
输出为
ABAB
,但在本例中:

void fork2()
{
    printf("A");
    fork();
    printf("B");
}
void fork2()
{
    printf("A\n");
    fork();
    printf("B\n");
}
输出为ABB(当然是单独的行)。第二个是有意义的,因为如果我正确理解了
fork()
,它会产生一个新的子项,该子项在
fork()
发生的位置之后立即开始(在本例中是
printf(“B\n”);
)。我不明白的是,当我包含新行字符时,为什么输出不同。

printf()
缓冲输出直到遇到新行。因此,您的
\n
-较少的版本将
A
放入输出缓冲区forks

由于这两个进程是相同的(减去PID和诸如此类的内容),它们现在都有一个包含
A
的输出缓冲区

继续执行,并将
B
打印到每个进程的缓冲区中。然后两个进程都退出,导致输出缓冲区刷新,输出缓冲区打印两次
AB
,每个进程打印一次

另一个版本具有
\n
,在第一次printf()调用后导致输出缓冲区刷新,当fork命中时,两个进程都有一个空缓冲区。

首先,不要在代码中定义
fork()
函数
fork()
是已经为您定义的系统调用

调用
fork()
,一旦它(成功)返回,就会有两个相同的进程执行
fork()调用之后的下一行代码。在父进程中,
fork()
将返回子进程的PID;在子进程中,返回代码为0。基于此返回代码,您的两个进程可以根据各自的角色执行它们想要执行的任何操作

现在,无法保证这两个过程的相对执行顺序。就你们所知,child可能在接下来的2分钟内不会执行,但它仍然是正确的行为。因此,这意味着您不能期望这两个过程的输出顺序是可预测的


最后,将
printf()
更改为
fprintf()
,以避免缓冲(在本例中,这会进一步混淆问题)。

我实际上将其称为fork2(),但在这里删除了2,因为我认为它更容易阅读。你说的有道理,所以我现在把它改回去。这个“答案”不能回答问题。问题主要是为什么第一种情况下“A”打印两次(第二种情况下打印一次),而不是打印顺序。非常好的解释,谢谢。