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

Sau*_*xit 9 c file manpage exit

手册页exit说,

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

手册页fcloseall说,

  1. 标准的流stdin,stdout以及stderr也将被关闭.
  2. fcloseall函数不会锁定流,因此它不是线程安全的.

许多在线教程都说,解除分配给定类型的"所有"资源是编程错误.它们应该由拥有它们的代码单独解除分配,或者根本不需要.

那么使用它exit代替fcloseall好吗?

Ted*_*val 9

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

答案很长:

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

在这种情况下,您既exit()不会使用也不会fcloseall()- 您只需return从中自行清理组件main().

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

另外,fcloseall()GNU扩展可能会影响程序的可移植性.

也许更重要的是,这些功能可用于不同的目的.

目的exit()是结束你的计划.

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


Kei*_*son 6

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

exit函数关闭并刷新所有stdio流 - 但它也会终止你的程序,但这fcloseall不会替代它.

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

标准流stdin,stdoutstderr一般不需要被显式关闭.当程序终止时,让系统关闭它们是完全可以的.如果你打开任何其他流,比如通过调用fopen,你应该自己跟踪每个这样的流,并在你完成它时明确地关闭它.