我正在尝试使用一些测试程序来理解fork()。我在cout和printf()之间发现了不同的行为:
计划1:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
printf("Hi , %d\n" , getpid());
fork();
return 0;
}
我明白了:
嗨,9375
嗨,9375
计划2:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
cout << "Hi , " <<getpid() << endl;
fork();
return 0;
}
我明白了:
嗨,7277
两个程序之间的唯一区别是第一次使用printf()
打印输出,而第二次使用cout
任何人都可以解释一下吗? 感谢
答案 0 :(得分:11)
当您使用stdio
时,stdout
是完全缓冲的,除非它正在写入终端;当写到终端时,它是行缓冲的。
因此,如果运行程序1并将输出重定向到文件或管道,printf
会将该行写入输出缓冲区,但不会刷新缓冲区。当进程分叉时,缓冲区在两个进程中都是重复的。当它们退出时,它们会刷新缓冲区的副本,从而打印出该行。
如果您写了以下内容,您将在计划2中获得相同的结果:
cout << "Hi , " <<getpid() << "\n";
但endl
除了输出换行符外,还会刷新缓冲区。计划1中的等价物是:
printf("Hi , %d\n" , getpid());
fflush(stdout);