Unix 中的 fork 函数

Fork function in Unix

我在 c 中创建了一个简单的 fork 程序

printf("first");
fork();
printf("second");

我了解到 fork 函数会创建一个从下一条指令开始执行的子进程,该指令应该类似于

firstsecondsecond

但我得到的输出是

firstsecondfirstsecond

我错了吗?

请记住 stdout 的输出(printf 写入的位置)是 缓冲的 。更具体地说,它在默认情况下(当输出到终端时)是行缓冲的,这意味着缓冲区在换行时被刷新。

现在这里发生的是第一个 printf 调用将 "first" 写入输出缓冲区,但它没有被刷新。然后你 fork,它创建了一个精确的进程副本,包括 stdout 缓冲区。然后两个进程都打印 "second".

之后,据推测,两个进程都结束,导致 stdout 被刷新并关闭。这会刷新两个进程中缓冲区的内容,它们将包含完全相同的数据,从而导致您获得输出。

如果您在调用 fork 之前显式刷新缓冲区(例如通过打印换行符或调用 fflush(stdout)),行为应该如您所愿。