使用 exit() 而不是 fcloseall() 来关闭多个文件好吗?
Is it good to use exit() instead of fcloseall() for closing multiple files?
exit
的手册页说,
- 所有打开的
stdio
流都被刷新并关闭。 tmpfile
创建的文件已删除。
exit
的参数,即 EXIT_SUCCESS
和 EXIT_FAILURE
比使用 0 和一些非零值(如 1 或 -1)稍微更便携(对非 UNIX 环境)。特别是,VMS 使用不同的约定。
fcloseall
的手册页说,
- 标准流
stdin
、stdout
和 stderr
也已关闭。
fcloseall
函数不锁定流,因此它不是线程安全的。
许多在线教程都说释放给定类型的 "all" 资源是一个编程错误。它们应该由拥有它们的代码单独释放,或者根本不释放。
那么用exit
代替fcloseall
好吗?
fcloseall
函数是 GNU 扩展。使用它会降低你的程序的可移植性。
exit
函数关闭并刷新所有 stdio 流 -- 但它也会终止您的程序,而 fcloseall
不会这样做,因此它很难替代。
如果程序将继续执行,那么调用 fcloseall
可能没有意义,如果程序即将终止,exit
将做同样的事情。
标准流 stdin
、stdout
和 stderr
通常不需要显式关闭。当程序终止时让系统为您关闭它们是完全可以的。如果您打开了任何其他流,例如通过调用 fopen
,您应该自己跟踪每个此类流,并在完成后明确关闭它。
简短回答:是的,exit()
更好。
长答案:
这取决于您如何设计程序。通常最好让每个组件自行清理,删除所有临时文件并刷新缓冲区 - 这对于对象析构函数可以处理此问题的 C++ 程序尤其常见。
在那种情况下,您既不会使用 exit()
也不会使用 fcloseall()
- 您可以让您的组件自行清理,然后只需 return
来自 main()
.
对于 C 程序,您可能更愿意将其设计为期望在退出时通过这些函数之一自动清除所有内容。如果您正在考虑使用其中任何一个,那么 exit()
是一个更安全的选择,因为它会做更多的事情:它会做 fcloseall()
做的事情,plus 它会删除临时文件使用 tmpfile()
.
创建
此外,fcloseall()
是一个 GNU 扩展,它可能会影响您的程序的可移植性。
也许更重要的是,这些函数有不同的用途。
exit()
的目的是结束您的程序。
fcloseall()
的目的是刷新和关闭文件描述符,而不是结束您的程序。当你想确保在调用 exec
启动另一个进程之前关闭所有文件(包括 stdin/stdout/stderr)时,这可能是最有用的,而不会将任何文件描述符泄漏到新进程中,这可能是它不会期望的永不关闭。
exit
的手册页说,
- 所有打开的
stdio
流都被刷新并关闭。tmpfile
创建的文件已删除。 exit
的参数,即EXIT_SUCCESS
和EXIT_FAILURE
比使用 0 和一些非零值(如 1 或 -1)稍微更便携(对非 UNIX 环境)。特别是,VMS 使用不同的约定。
fcloseall
的手册页说,
- 标准流
stdin
、stdout
和stderr
也已关闭。 fcloseall
函数不锁定流,因此它不是线程安全的。
许多在线教程都说释放给定类型的 "all" 资源是一个编程错误。它们应该由拥有它们的代码单独释放,或者根本不释放。
那么用exit
代替fcloseall
好吗?
fcloseall
函数是 GNU 扩展。使用它会降低你的程序的可移植性。
exit
函数关闭并刷新所有 stdio 流 -- 但它也会终止您的程序,而 fcloseall
不会这样做,因此它很难替代。
如果程序将继续执行,那么调用 fcloseall
可能没有意义,如果程序即将终止,exit
将做同样的事情。
标准流 stdin
、stdout
和 stderr
通常不需要显式关闭。当程序终止时让系统为您关闭它们是完全可以的。如果您打开了任何其他流,例如通过调用 fopen
,您应该自己跟踪每个此类流,并在完成后明确关闭它。
简短回答:是的,exit()
更好。
长答案:
这取决于您如何设计程序。通常最好让每个组件自行清理,删除所有临时文件并刷新缓冲区 - 这对于对象析构函数可以处理此问题的 C++ 程序尤其常见。
在那种情况下,您既不会使用 exit()
也不会使用 fcloseall()
- 您可以让您的组件自行清理,然后只需 return
来自 main()
.
对于 C 程序,您可能更愿意将其设计为期望在退出时通过这些函数之一自动清除所有内容。如果您正在考虑使用其中任何一个,那么 exit()
是一个更安全的选择,因为它会做更多的事情:它会做 fcloseall()
做的事情,plus 它会删除临时文件使用 tmpfile()
.
此外,fcloseall()
是一个 GNU 扩展,它可能会影响您的程序的可移植性。
也许更重要的是,这些函数有不同的用途。
exit()
的目的是结束您的程序。
fcloseall()
的目的是刷新和关闭文件描述符,而不是结束您的程序。当你想确保在调用 exec
启动另一个进程之前关闭所有文件(包括 stdin/stdout/stderr)时,这可能是最有用的,而不会将任何文件描述符泄漏到新进程中,这可能是它不会期望的永不关闭。