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()
以避免缓冲(在这种情况下会进一步混淆)。