我正在使用fork()
编写一个多进程程序,我碰到了一个问题。
下面是一个重现问题的示例代码(没有任何错误检查):
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
printf("hello world");
fork();
}
此代码打印2&#34; hello world&#34;陈述(一个来自父母,另一个来自孩子)。但是,这不应该是这种情况,因为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
显示。
有人能提供更好的解释吗?或者甚至更好,如果我错了或错过了什么,请纠正我。
答案 0 :(得分:2)
文件句柄stdout
(由printf
使用)默认为行缓冲,这意味着将使用printf
刷新输出(并显示在控制台中)当有换行符或缓冲区已满时。
当fork
创建父进程的精确副本时,两个进程在(未刷新的)输出缓冲区中具有相同的内容,并且当两个进程退出时都将刷新它们。
所以是的,你的猜测是正确的。