c - stdout 流在重定向后更改顺序?

标签 c io-redirection

这几天在学习《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/

相关文章:

c - 添加了 goto 语句;现在我收到 EXC_BAD_ACCESS 错误

c - 为什么来自 main 的 Pthread 信号会挂起代码?

bash - 重定向错误*来自重定向操作本身*

c - 如何将输入/输出重定向放在新创建的 c shell 中?

C++ 释放的指针未分配。不免费打电话

c - 如何创建指向 3 维数组的 2 维的指针?

c - 米斯拉-C : cast literal number

java - 重定向应用程序(java)的输入但仍然允许 BASH 中的标准输入

powershell - Powershell脚本输出到变量-捕获Write-Host输出

linux - 如何使用 sudo 将输出重定向到我无权写入的位置?