这几天在学习《apue》,结果一个典型案例把我搞糊涂了。以下是“sample.c”的示例代码:
#include "apue.h"
#include <stdio.h>
#define BUFF_SZ 4096
int main()
{
int n = 0;
char buff[BUFF_SZ] = {'\0'};
while ((n = read(STDIN_FILENO, buff, BUFF_SZ)) > 0) {
printf("read %d bytes\n", n);
if (write(STDOUT_FILENO, buff, n) != n) {
err_sys("write error");
}
}
if (n < 0) {
err_sys("read error");
}
return 0;
}
编译gcc sample.c
后,可以使用这个命令echo Hello | ./a.out
并在终端上获得以下标准输出:
read 6 bytes
Hello
但是,如果您重定向 输出到一个文件 echo Hello | ./a.out > outfile
,然后使用cat outfile
查看内容:
Hello
read 6 bytes
输出在重定向 后改变了顺序!不知道有没有人能告诉我原因?
最佳答案
对于标准 I/O 函数 printf
,当您输出到终端时,标准输出默认是行缓冲的。
printf("read %d bytes\n", n);
\n
此处导致输出刷新。
但是,当您输出到文件时,默认情况下它是完全缓冲的。除非缓冲区已满,否则输出不会刷新,或者您明确刷新它。
另一方面,低级系统调用write
是无缓冲的。
一般来说,不建议将标准 I/O 调用与系统调用混合使用。
关于c - stdout 流在重定向后更改顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990819/