执行fork()时cout vs printf

时间:2014-01-31 23:15:42

标签: 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;
}

我明白了:

嗨,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

任何人都可以解释一下吗? 感谢

1 个答案:

答案 0 :(得分:11)

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

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

如果您写了以下内容,您将在计划2中获得相同的结果:

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

endl除了输出换行符外,还会刷新缓冲区。计划1中的等价物是:

printf("Hi , %d\n" , getpid());
fflush(stdout);