【问题标题】:Output not printing without fflush(stdout)没有 fflush (stdout) 输出不打印
【发布时间】:2011-11-29 19:04:45
【问题描述】:

我不明白为什么有时我需要使用 fflush() 而有时不需要。

我的程序目前出现段错误,我正在使用打印语句对其进行调试。当程序出现段错误时,stdout 不会自动刷新其缓冲区吗?

【问题讨论】:

  • stdout 只是一个指针,它本身不会“做”任何事情。真正的问题是,“操作系统不会刷新所有打开的文件吗?”

标签: c io stdout fflush


【解决方案1】:

我不明白为什么有时我需要使用 fflush() 有时 不是。

有时stdio 缓冲区会被刷新,有时它们不会。例如,简单地在打印的内容中包含“\n”通常会刷新它(因为stdout 在连接到终端时默认为行缓冲)。

当程序出现段错误时,stdout 是否不会刷新其缓冲区 自动?

Stdio 缓冲区由exit 刷新。当一个信号(例如SIGSEGV)杀死一个进程时,exit 不会被调用。另一种退出进程而不刷新stdio 缓冲区的方法是使用Unix 特定的调用_exit

【讨论】:

    【解决方案2】:

    不,为什么要这样。该程序被操作系统杀死。如果发生段错误,则程序不再处于有意义的状态,因此除了立即终止之外,没有任何事情可以安全地发生。

    (不要有人尝试为SIGSEGV注册信号处理程序。)

    【讨论】:

    • 在某些情况下,为SIGSEGV 注册信号处理程序是有效的 - 例如,如果您使用mmap 进行只读映射,您可以捕获和longjmp 写入尝试使用信号处理程序对其进行尝试,并且只要写入不是由异步信号不安全函数执行的,这是 100%(就 POSIX 而言)可移植且有效的。
    • @R..:像往常一样使用“伪建议”:一旦您了解何时可以安全地忽略它,您就可以放心地忽略它;-) 无论如何,您最终必须终止程序;你无法从信号中恢复过来。
    【解决方案3】:

    “我无法弄清楚为什么在这段代码中调用了 fflush (stdout) 我尝试评论这一行,行为完全一样。”

    因为如果那样的话,你不能保证看到以前的 printf() 输出 输出不以换行符结尾。

    基本上,只有在显示提示时才需要它 换行符,并且您要确保用户可以看到它。

    this site.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多