Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Unix中的Fork函数_C_Fork - Fatal编程技术网

C Unix中的Fork函数

C Unix中的Fork函数,c,fork,C,Fork,我用c创建了一个简单的fork程序 printf("first"); fork(); printf("second"); 我了解到fork函数创建了一个子进程,该子进程从下一条指令开始执行,如下所示 firstsecondsecond 但我得到的结果是 firstsecondfirstsecond 我错了吗?记住输出到标准输出,这是printf写入的缓冲区。更具体地说,当输出被缓冲到终端行时,默认情况下,这意味着缓冲区在换行时刷新 现在这里发生的是,第一个printf调用首先写入输出缓冲区

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

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