【问题标题】:output redirection produces empty file [duplicate]输出重定向产生空文件[重复]
【发布时间】:2013-05-18 20:41:29
【问题描述】:

所以这可能是一个愚蠢的问题,但我看不出我做错了什么。

我正在运行一个程序,当像./ar 这样调用时会产生输出。输出如下:

-0.00781 0.02344 0.98828                                                        
-0.01172 0.02734 0.98828                                                        
-0.01562 0.02344 0.98047                                                        
-0.00781 0.02344 1.00000                                                        
-0.00391 0.02344 0.98438 

每秒写入一个新的输出行。

当我调用这样的代码 ./ar > log 并在几秒钟后使用 ctrl-c 杀死程序时,文件 log 是空的。

我在嵌入式系统上运行此代码。系统有一个可写分区,这是我正在运行的分区,并且我以 root 身份登录时具有写访问权限。

【问题讨论】:

  • 重定向时,输出是块缓冲的,而不是行缓冲的。如果您在一个块已满之前按 Ctrl-C,则不会将任何内容写入文件。您可以使用fflush(stdout) 使其立即写入文件。
  • 谢谢,这解决了我的问题,我必须在每个 printf 语句之前运行这一行。
  • printf之后做更自然。

标签: c linux bash


【解决方案1】:

您确定在调用 ./ar 时查看标准输出吗?这可能是标准错误。 所以,尝试 ./ar >log 2>err 来拥有 2 个文件,一个用于 stdout,一个用于 stderr。

或使用 ./ar 2>&1 >log 为两个流获取一个文件。

【讨论】:

    【解决方案2】:

    原因是UNIX系统的懒写概念。

    【讨论】:

    • 还有一件事,因为您正在重定向输出并终止您的进程,这意味着输出尚未准备好。只有当第一个进程的输出就绪时,管道操作才会将输出转发到下一个进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2018-09-02
    • 2014-03-03
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多