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)
),行为应该如您所愿。
我在 c 中创建了一个简单的 fork 程序
printf("first");
fork();
printf("second");
我了解到 fork 函数会创建一个从下一条指令开始执行的子进程,该指令应该类似于
firstsecondsecond
但我得到的输出是
firstsecondfirstsecond
我错了吗?
请记住 stdout
的输出(printf
写入的位置)是 缓冲的 。更具体地说,它在默认情况下(当输出到终端时)是行缓冲的,这意味着缓冲区在换行时被刷新。
现在这里发生的是第一个 printf
调用将 "first"
写入输出缓冲区,但它没有被刷新。然后你 fork,它创建了一个精确的进程副本,包括 stdout
缓冲区。然后两个进程都打印 "second"
.
之后,据推测,两个进程都结束,导致 stdout
被刷新并关闭。这会刷新两个进程中缓冲区的内容,它们将包含完全相同的数据,从而导致您获得输出。
如果您在调用 fork
之前显式刷新缓冲区(例如通过打印换行符或调用 fflush(stdout)
),行为应该如您所愿。