fork()和“\ n”

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

 void fork2() { printf("A"); fork(); printf("B"); } 

输出是ABAB ,但在此示例中:

 void fork2() { printf("A\n"); fork(); printf("B\n"); } 

输出是ABB (当然是单独的线路)。 第二个是有道理的,因为如果我正确理解fork()它会产生一个新的子项,它在fork()发生的地方之后开始(所以printf("B\n");在这种情况下)。 我不明白的是,当我包含新行字符时输出是不同的。

printf()缓冲输出,直到遇到换行符。 所以你的\n no版本A填充到输出缓冲区中,分叉。

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

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

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

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

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

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

最后,将printf()更改为fprintf()以避免缓冲(在这种情况下会进一步混淆)。