使用exit()而不是fcloseall()来关闭多个文件是否合适?

时间:2015-08-12 18:33:29

标签: c file exit manpage

exit的手册页说,

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

    1. 标准流stdinstdoutstderr也已关闭。
    2. fcloseall函数不会锁定流,因此它不是线程安全的。
    3. 许多在线教程都说取消分配"所有"给定类型的资源是编程错误。它们应该由拥有或不拥有它们的代码单独解除分配。

      使用exit代替fcloseall是否合适?

2 个答案:

答案 0 :(得分:9)

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

答案很长:

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

在这种情况下,您既不会使用exit()也不会使用fcloseall() - 您可以自行清理组件,然后只需return main()清空组件。

对于C程序,您可能更愿意设计它,期望在退出时通过其中一个功能自动清理所有内容。如果你正在考虑使用其中任何一个,那么exit()是一个更安全的赌注,因为它会做更多:它将执行fcloseall()所做的事情, plus 它将删除用{创建的临时文件{1}}。

此外,tmpfile()是GNU扩展,可能会影响程序的可移植性。

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

fcloseall()的目的是结束你的计划。

exit()的目的是冲洗&关闭文件描述符,但不是为了结束你的程序。当你想要确保在调用fcloseall()以启动另一个进程之前关闭所有文件(包括stdin / stdout / stderr)时,它可能是最有用的,而不会将任何文件描述符泄漏到它不会期望的新进程中。永远不会关闭。

答案 1 :(得分:6)

fcloseall函数是GNU扩展。使用它会降低程序的可移植性。

exit功能会关闭并刷新所有stdio流 - 但它也会终止您的程序,fcloseall不会这样做,所以它几乎不能替代。

如果程序将继续执行,调用fcloseall可能没有意义,如果它即将终止,exit也会做同样的事情。

标准流stdinstdoutstderr通常不需要明确关闭。当程序终止时,让系统为您关闭它们是完全正确的。如果您已打开任何其他信息流,例如拨打fopen,则应自行跟踪每个此类信息流,并在完成后立即将其关闭。