如下代码输出什么?
#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和缓冲相关的问题: