C++ 执行fork()时cout vs printf

C++ 执行fork()时cout vs printf,c++,fork,printf,cout,C++,Fork,Printf,Cout,我试图通过一些测试程序来理解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; }

我试图通过一些测试程序来理解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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
printf(“Hi,%d\n”,getpid());
fork();
返回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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{

cout当您使用
stdio
时,
stdout
是完全缓冲的,除非它正在写入终端;当写入终端时,它是行缓冲的

因此,如果运行程序1时将输出重定向到文件或管道,
printf
将行写入输出缓冲区,但不刷新缓冲区。当进程分叉时,缓冲区在两个进程中重复。当它们退出时,它们各自刷新缓冲区的副本,从而打印行

如果您编写了以下代码,则在程序2中会得到相同的结果:

cout << "Hi , " <<getpid() << "\n";

<代码> CUT= C++< /COD>,<代码> Prtff= C++ <代码>。你可以在C++中使用它们,但是它总是建议使用本机语言显示函数。我只在第一个输出中得到一个输出。你是写文件而不是终端吗?可能的副本@ OrErAkai,我的问题是当使用PrtTf,输出“HI,9375”时。在使用cout out时打印两次,输出“Hi,7277”仅在我认为您是对的时候打印,Barmar,与之相反,cout std::endl大于“\n”,这相当于在打印后调用fflush(),这就是我所说的。如果您将
endl
更改为
”\n
程序2与程序1类似,因为它不会刷新缓冲区。
printf("Hi , %d\n" , getpid());
fflush(stdout);