首页 > 解决方案 > Unix中的fork函数

问题描述

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

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

我了解到 fork 函数创建了一个从下一条指令执行的子进程,它应该像

firstsecondsecond

但我得到的输出是

firstsecondfirstsecond

我错了吗?

标签: cfork

解决方案


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

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

在那之后,大概两个进程都结束了,这导致stdout被刷新和关闭。这会刷新两个进程中缓冲区的内容,这些内容将包含完全相同的数据,从而产生您获得的输出。

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


推荐阅读