我不明白为什么有时我需要使用fflush()
,有时不需要。输出不打印没有fflush(标准输出)
我的程序目前是segfaulting,我正在用打印语句进行调试。当程序出现段错误时,stdout
不会自动刷新其缓冲区吗?
我不明白为什么有时我需要使用fflush()
,有时不需要。输出不打印没有fflush(标准输出)
我的程序目前是segfaulting,我正在用打印语句进行调试。当程序出现段错误时,stdout
不会自动刷新其缓冲区吗?
我不明白为什么有时我需要使用fflush(),有时不 。
有时stdio
缓冲区刷新有时他们不是。例如,简单地在打印的东西中包含“\ n”通常会将其刷新(因为stdout
在连接到终端时默认为行缓冲)。
当一个程序段错误,stdout没有自动刷新它的缓冲区 ?
Stdio缓冲区被冲刷exit
。当一个信号(如SIGSEGV
)杀死一个进程时,exit
不叫。在不刷新缓冲区的情况下退出进程的另一种方法是使用特定于Unix的调用_exit
。
“我不明白为什么fflush(标准输出)在此代码中调用 我尝试评论此行并且行为完全相同。”
因为如果 输出没有以换行符结束,您不能保证看到以前的printf()输出。
基本上,你只需要它,如果你正在显示说一个提示没有 换行符,并且你想确保用户可以看到它。
没有,何必呢。该程序被操作系统杀死。如果发生段错误,则程序不再处于有意义的状态,因此除了立即终止以外,没有任何事情可以安全地发生。
(不要任何人尝试注册一个信号处理程序SIGSEGV
)
在某些情况下,为'SIGSEGV'注册一个信号处理程序是有效的 - 例如,如果您使用'mmap'进行只读映射,则可以通过信号处理程序捕获并写入'longjmp' ,并且这是100%(就POSIX而言)便携且有效,只要写入不是由异步信号不安全功能执行。 –
@R ..:像往常一样用“伪建议”:一旦你明白什么时候可以忽略它,你可以放心地忽略它;-)无论如何,你必须最终终止程序;你无法从信号中恢复。 –
'stdout'只是一个指针,它本身并不“做”任何事情。真正的问题是,“操作系统不是冲洗所有打开的文件?” –