C Unix中的Fork函数
我用c创建了一个简单的fork程序C Unix中的Fork函数,c,fork,C,Fork,我用c创建了一个简单的fork程序 printf("first"); fork(); printf("second"); 我了解到fork函数创建了一个子进程,该子进程从下一条指令开始执行,如下所示 firstsecondsecond 但我得到的结果是 firstsecondfirstsecond 我错了吗?记住输出到标准输出,这是printf写入的缓冲区。更具体地说,当输出被缓冲到终端行时,默认情况下,这意味着缓冲区在换行时刷新 现在这里发生的是,第一个printf调用首先写入输出缓冲区
printf("first");
fork();
printf("second");
我了解到fork函数创建了一个子进程,该子进程从下一条指令开始执行,如下所示
firstsecondsecond
但我得到的结果是
firstsecondfirstsecond
我错了吗?记住输出到标准输出,这是printf写入的缓冲区。更具体地说,当输出被缓冲到终端行时,默认情况下,这意味着缓冲区在换行时刷新
现在这里发生的是,第一个printf调用首先写入输出缓冲区,但它没有刷新。然后使用fork,它会创建进程的精确副本,包括stdout缓冲区。然后两个进程都以秒为单位打印
之后,这两个过程可能都会结束,从而导致冲洗和关闭标准液。这将刷新两个进程中缓冲区的内容,缓冲区将包含完全相同的数据,从而得到输出
如果在调用fork之前显式刷新缓冲区(例如,通过打印换行符或调用fflushstdout),则行为应与您预期的一样。请记住,stdout的输出是printf写入的缓冲区。更具体地说,当输出被缓冲到终端行时,默认情况下,这意味着缓冲区在换行时刷新
现在这里发生的是,第一个printf调用首先写入输出缓冲区,但它没有刷新。然后使用fork,它会创建进程的精确副本,包括stdout缓冲区。然后两个进程都以秒为单位打印
之后,这两个过程可能都会结束,从而导致冲洗和关闭标准液。这将刷新两个进程中缓冲区的内容,缓冲区将包含完全相同的数据,从而得到输出
如果在调用fork之前显式刷新缓冲区(例如,通过打印换行符或调用fflushstdout),则行为应与您预期的一样。在forking之前尝试fflush stdout在forking之前尝试fflush stdout