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”打印两次(第二种情况下打印一次),而不是打印顺序。非常好的解释,谢谢。