如下代码输出什么?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    fprintf(stderr, "Hello ");
    fprintf(stdout, "It's a small ");
    fprintf(stderr, "World\n");
    fprintf(stdout, "place\n");

    return 0;
}

运行结果:

[root systemProgramming]#./printf
Hello World
It's a small place

[root systemProgramming]#./printf >output 2>&1
[root systemProgramming]#cat output
Hello World
It's a small place

如果将代码修改为:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    fprintf(stderr, "Hello ");
    fprintf(stdout, "It's a small\n");
    fprintf(stderr, "World\n");
    fprintf(stdout, "place\n");

    return 0;
}

运行结果:

[root systemProgramming]#./printf
Hello It's a small
World
place
[root systemProgramming]#

[root systemProgramming]#./printf >output 2>&1
[root systemProgramming]#
[root systemProgramming]#
[root systemProgramming]#cat output
Hello World
It's a small
place
[root systemProgramming]#

解释:
当标准输出重定向到终端时缺省为行缓冲,所以会立即显示函数printf()输出的包含换行符的字符串。当标准输出重定向到文件时为块缓冲。
通过上面的例子我们可以清晰的验证上述结论,虽然small后面有换行符,当我们重定向到文件时,依然是World先写入到文件。

另外几个跟fork和缓冲相关的问题:
一道fork面试题
系统调用与标准IO
文件IO缓冲