【发布时间】:2011-11-29 19:04:45
【问题描述】:
我不明白为什么有时我需要使用 fflush() 而有时不需要。
我的程序目前出现段错误,我正在使用打印语句对其进行调试。当程序出现段错误时,stdout 不会自动刷新其缓冲区吗?
【问题讨论】:
-
stdout只是一个指针,它本身不会“做”任何事情。真正的问题是,“操作系统不会刷新所有打开的文件吗?”
我不明白为什么有时我需要使用 fflush() 而有时不需要。
我的程序目前出现段错误,我正在使用打印语句对其进行调试。当程序出现段错误时,stdout 不会自动刷新其缓冲区吗?
【问题讨论】:
stdout 只是一个指针,它本身不会“做”任何事情。真正的问题是,“操作系统不会刷新所有打开的文件吗?”
我不明白为什么有时我需要使用 fflush() 有时 不是。
有时stdio 缓冲区会被刷新,有时它们不会。例如,简单地在打印的内容中包含“\n”通常会刷新它(因为stdout 在连接到终端时默认为行缓冲)。
当程序出现段错误时,stdout 是否不会刷新其缓冲区 自动?
Stdio 缓冲区由exit 刷新。当一个信号(例如SIGSEGV)杀死一个进程时,exit 不会被调用。另一种退出进程而不刷新stdio 缓冲区的方法是使用Unix 特定的调用_exit。
【讨论】:
不,为什么要这样。该程序被操作系统杀死。如果发生段错误,则程序不再处于有意义的状态,因此除了立即终止之外,没有任何事情可以安全地发生。
(不要有人尝试为SIGSEGV注册信号处理程序。)
【讨论】:
SIGSEGV 注册信号处理程序是有效的 - 例如,如果您使用mmap 进行只读映射,您可以捕获和longjmp 写入尝试使用信号处理程序对其进行尝试,并且只要写入不是由异步信号不安全函数执行的,这是 100%(就 POSIX 而言)可移植且有效的。
“我无法弄清楚为什么在这段代码中调用了 fflush (stdout) 我尝试评论这一行,行为完全一样。”
因为如果那样的话,你不能保证看到以前的 printf() 输出 输出不以换行符结尾。
基本上,只有在显示提示时才需要它 换行符,并且您要确保用户可以看到它。
【讨论】: