fork() 之前的 Printf 被打印两次
Printf before fork() is being printed twice
我在使用 fork()
编写多进程程序时遇到了问题。
下面是重现问题的示例代码(没有任何类型的错误检查):
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("hello world");
fork();
}
此代码打印 2 个 "hello world" 语句(一个来自父项,另一个来自子项)。然而,这不应该是这种情况,因为 printf
函数调用在 fork()
系统调用之前。
经过测试,问题似乎可以通过以下方式解决:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("hello world\n"); \ addition of the new line character
// or by using fflush(stdout);
fork();
}
我的猜测是 printf
缓冲区在未刷新时正在复制,因此子进程在退出前清空了该缓冲区的副本。因此其他 printf
显示。
谁能对这个问题提供更好的解释?或者更好的是,如果我错了或遗漏了什么,请纠正我。
文件句柄 stdout
(由 printf
使用)默认为 行缓冲,这意味着使用 printf
的输出将当有换行符或缓冲区已满时被刷新(并显示在控制台中)。
由于fork
创建父进程的精确副本,两个进程在(未刷新的)输出缓冲区中具有相同的内容,并且在两个进程退出时都将被刷新。
所以是的,你的猜测是正确的。
我在使用 fork()
编写多进程程序时遇到了问题。
下面是重现问题的示例代码(没有任何类型的错误检查):
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("hello world");
fork();
}
此代码打印 2 个 "hello world" 语句(一个来自父项,另一个来自子项)。然而,这不应该是这种情况,因为 printf
函数调用在 fork()
系统调用之前。
经过测试,问题似乎可以通过以下方式解决:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("hello world\n"); \ addition of the new line character
// or by using fflush(stdout);
fork();
}
我的猜测是 printf
缓冲区在未刷新时正在复制,因此子进程在退出前清空了该缓冲区的副本。因此其他 printf
显示。
谁能对这个问题提供更好的解释?或者更好的是,如果我错了或遗漏了什么,请纠正我。
文件句柄 stdout
(由 printf
使用)默认为 行缓冲,这意味着使用 printf
的输出将当有换行符或缓冲区已满时被刷新(并显示在控制台中)。
由于fork
创建父进程的精确副本,两个进程在(未刷新的)输出缓冲区中具有相同的内容,并且在两个进程退出时都将被刷新。
所以是的,你的猜测是正确的。