5

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

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

4

3 回答 3

9

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

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

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

Stdio 缓冲区由exit. 当一个信号(例如SIGSEGV)杀死一个进程时,exit不调用。另一种在不刷新stdio缓冲区的情况下退出进程的方法是使用 Unix-specific call _exit

于 2011-11-29T19:10:44.117 回答
1

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

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

于 2011-11-29T19:08:00.937 回答
0

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

因为如果该输出不以换行符结尾,则不能保证您会看到以前的 printf() 输出。

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

看到这个网站。

于 2011-11-29T19:07:59.703 回答