没有 fflush(stdout) 则输出不打印
我不明白为什么有时需要使用 fflush() 而有时不需要。
我的程序目前出现段错误,我正在使用 print 语句对其进行调试。当程序出现段错误时,stdout 是否不会自动刷新其缓冲区?
I don't understand why sometimes I need to use fflush()
and sometimes not.
My program is segfaulting at the moment and I am debugging it with print statements. When a program segfaults, does stdout
not flush its buffer automatically?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有时,stdio 缓冲区会被刷新,有时则不会。例如,简单地在打印内容中包含“\n”通常会刷新它(因为
stdout
在连接到终端时默认是行缓冲的)。Stdio 缓冲区由
exit
刷新。当信号(例如SIGSEGV
)终止进程时,exit
不会被调用。另一种退出进程而不刷新stdio
缓冲区的方法是使用 Unix 特定的调用_exit
。Sometimes the
stdio
buffers are flushed sometimes they aren't. For example simply including a "\n" in the printed stuff will typically flush it (becausestdout
is by default line-buffered when attached to a terminal).Stdio buffers are flushed by
exit
. When a signal (such asSIGSEGV
) kills a process,exit
is not called. Another way to exit a process without flushing thestdio
buffers is to use the Unix-specific call_exit
.不,为什么要这样。该程序被操作系统杀死。如果发生段错误,程序将不再处于有意义的状态,因此除了立即终止之外,此时无法安全地发生任何事情。
(并且不要有人尝试为
SIGSEGV
注册信号处理程序。)No, why should it. The program gets killed by the operating system. If a segfault occurs, the program is no longer in a meaningful state, so nothing can safely happen at that point other than immediate termination.
(And don't nobody try to register a signal handler for
SIGSEGV
.)请参阅此网站
See this site.