2011-11-29 74 views
4

我不明白为什么有时我需要使用fflush(),有时不需要。输出不打印没有fflush(标准输出)

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

+1

'stdout'只是一个指针,它本身并不“做”任何事情。真正的问题是,“操作系统不是冲洗所有打开的文件?” –

回答

8

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

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

当一个程序段错误,stdout没有自动刷新它的缓冲区 ?

Stdio缓冲区被冲刷exit。当一个信号(如SIGSEGV)杀死一个进程时,exit不叫。在不刷新缓冲区的情况下退出进程的另一种方法是使用特定于Unix的调用_exit

0

“我不明白为什么fflush(标准输出)在此代码中调用 我尝试评论此行并且行为完全相同。”

因为如果 输出没有以换行符结束,您不能保证看到以前的printf()输出。

基本上,你只需要它,如果你正在显示说一个提示没有 换行符,并且你想确保用户可以看到它。

this site.

1

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

(不要任何人尝试注册一个信号处理程序SIGSEGV

+0

在某些情况下,为'SIGSEGV'注册一个信号处理程序是有效的 - 例如,如果您使用'mmap'进行只读映射,则可以通过信号处理程序捕获并写入'longjmp' ,并且这是100%(就POSIX而言)便携且有效,只要写入不是由异步信号不安全功能执行。 –

+1

@R ..:像往常一样用“伪建议”:一旦你明白什么时候可以忽略它,你可以放心地忽略它;-)无论如何,你必须最终终止程序;你无法从信号中恢复。 –