c - 使用 exit() 而不是 fcloseall() 来关闭多个文件好吗?

标签 c file exit manpage

exit 的手册页说,

  1. 所有打开的 stdio 流都被刷新并关闭。由 tmpfile 创建的文件被删除。
  2. exit 的参数,即 EXIT_SUCCESSEXIT_FAILURE 比使用 0 和一些非零值更具可移植性(对于非 UNIX 环境)值如 1 或 -1。特别是,VMS 使用不同的约定。

fcloseall 的手册页说,

  1. 标准流 stdinstdoutstderr 也已关闭。
  2. fcloseall 函数不锁定流,因此它不是线程安全的。

许多在线教程都说取消分配给定类型的“所有”资源是一个编程错误。它们应该由拥有它们的代码单独释放,或者根本不释放。

那么用exit代替fcloseall好不好?

最佳答案

简短回答:是的,exit()更好。

长答案:

这取决于您如何设计程序。通常最好让每个组件自行清理,删除任何临时文件并刷新缓冲区 - 这对于对象析构函数可以处理此问题的 C++ 程序尤其常见。

在那种情况下,您将不会使用 exit()也不fcloseall() - 你会让你的组件自行清理然后简单地 return来自 main() .

对于 C 程序,您可能更愿意将其设计为期望在退出时通过这些函数之一自动清除所有内容。如果您正在考虑使用其中任何一个,那么 exit()是一个更安全的选择,因为它会做更多:它会做 fcloseall()会,加上 它将删除使用 tmpfile() 创建的临时文件.

此外,fcloseall()是一个 GNU 扩展,它可能会影响您的程序的可移植性。

也许更重要的是,这些功能有不同的用途。

exit()的目的|是结束你的程序。

fcloseall()的目的|是刷新和关闭文件描述符,而不是结束你的程序。当您想确保在调用 exec 之前关闭所有文件(包括 stdin/stdout/stderr)时,它可能最有用。启动另一个进程,而不会将任何文件描述符泄漏到新进程中,这是它不会期望并且可能永远不会关闭的。

关于c - 使用 exit() 而不是 fcloseall() 来关闭多个文件好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31972860/

相关文章:

c++ - 在两个四元数之间插值很长

java - 将换行符写入文件

java - 如何用 Java 解析和分析 DTD 文件?

c - 如何使用 fwrite() 多次写入默认结构值

c - 使用递归的解决方案数量

c - 从管道命令读取文件名

c - 文件无缓冲 I/O : Read and Write a String in C 的问题

android - 使用 finish() 和明确的退出按钮节省电池生命周期?

java - 退出时的后退按钮会产生强制关闭错误

html - CSS退出框怎么来的?