【问题标题】:Printf not printing immediately, although buffering is disabledPrintf 不立即打印,尽管缓冲被禁用
【发布时间】:2018-05-15 12:33:43
【问题描述】:

我在 C 中的 printf 函数有问题。它只是不打印输出,尽管缓冲被禁用:

setbuf(stdout, NULL);  

setvbuf(stdout, NULL, _IONBF, 0);

我也在使用fflush(stdout);,但它仍然不起作用。
这是确切的代码:

int setup(){
    //...
    printf("Setup successful\n");
    fflush(stdout);
    return 0;
}
int main(int argc, char *argv[]){
    setbuf(stdout, NULL);
    setvbuf(stdout, NULL, _IONBF, 0);
    setup();
    //...
)

如果信息有帮助;我在 Linux(树莓派)上。
提前致谢!

【问题讨论】:

  • 如果您希望得到答案,您需要显示代码的minimal reproducible example
  • "函数 setvbuf() 成功时返回 0。失败时返回非零(模式无效或请求无法被接受)。失败时可能会设置 errno。"
  • 您是否在执行开始时/在任何其他 printf 调用之前将流设置为无缓冲? -“setvbuf() 函数只能在打开流之后和对其执行任何其他操作之前使用。” setbuf() 也是如此。
  • 发布minimal reproducible example 会有所帮助。目前尚不清楚为什么没有发布完整的可编译代码并附有悬赏问题。
  • @itzFlubby 不要描述代码,显示代码。描述代码说“这基本上是我告诉计算机要做的”。问题是,计算机不会“基本上”按照你告诉他们的去做。他们完全地按照你告诉他们的去做。因此,请确切地告诉我们您要告诉计算机做什么,即将代码显示为 minimal reproducible example,其他人可以编译和运行以复制您的问题。

标签: c linux printf buffer raspberry-pi3


【解决方案1】:

我已尝试尽可能地重现您的设置。因此,我在 VirtualBox 映像中安装了 Raspbian(树莓派操作系统),并使用 Geany 创建、编译和执行 C 文件。这是完整的代码:

#include <stdio.h>

int main() {
    printf("Setup successful\n");
}
  1. 将此文件另存为test.c:

  2. 接下来,点击“Build”(砖形图标):

  3. 最后,运行它(点击纸飞机图标):

如您所见,此代码正确编译、执行并打印消息。不需要显式刷新 (printf to stdout automatically flushes when encountering a newline character)。此行为由 Raspbian 安装的工具标准化并正确实施,因此很可靠。

【讨论】:

  • 首先对您的努力表示敬意。如果您在打印后直接运行无限循环,是否会出现相同的输出?喜欢printf("test\n"); while(1){}
  • @itzFlubby 是:遇到'\n' 后立即刷新缓冲区。输出是终端上的单个“测试”。 ——这不适合你吗?
  • 不,它不会刷新。
  • 程序编译时是否带有-g标志进行调试?
  • @itzFlubby 恐怕不会,-g 不会改变这个行为。
猜你喜欢
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多