在Unix C编程中,是显式地关闭文件句柄还是让操作系统关闭它们?

3
在Unix C编程中,显式关闭文件句柄在进程退出前是否被认为是良好的实践?或者,让操作系统关闭文件句柄并避免不必要的代码,这才是良好的实践?
通常情况下,哪种方法会被视为首选?
示例:
int main (int argc, char* argv[])
{
    int sd;
    sd = socket(...);

    // Snip

   close(sd); // Good or bad practice?
   return 0;
}
7个回答

10

通常负责打开和关闭过程的代码并不知道进程是否会立即退出,因此最好包含显式代码。

即使代码驻留在顶层的main()函数中,以防将来重新使用代码,这仍然是一个好主意。


5

通常情况下,自己关闭文件是个好习惯。

这可能是为了养成好习惯,在你使用特定的“文件”后,即使程序增长并且退出需要一些时间,也可以进行关闭。

例外情况是标准输入、标准输出和标准错误,这些都是进程没有打开的。

顺便提一下,UNIX术语是“文件描述符”。


2

如果可能的话,关闭文件绝对是一个好的做法。

如果你的程序更改后,文件可以尽早关闭,那么在文件I/O重构时就不需要记得添加close()


2

自从大学以来,我就没有使用过Unix,但是通过依赖于Unix关闭文件句柄,您可以减少代码被使用的方式。

如果您的代码需要移植到另一个平台,或者需要修改代码以作为长时间运行的服务运行,那么您正在为自己制造一场噩梦,如果没有明确的资源管理,您很快就会耗尽资源。

希望这对您有所帮助。


1

如果您的程序将继续运行但不再需要描述符,则关闭描述符是非常好的实践。

然而,这取决于文件描述符类型。例如,关闭套接字将刷新它,如果失败,您可能需要重试。


0

我认为这几乎是“普遍的”,如果您打开了操作系统资源,那么在使用完它们后应该立即关闭它们。这样,您就可以释放这些资源,以便其他应用程序可以使用它们。

通过依赖操作系统来关闭句柄,他只会在认为您不再需要它们时(例如应用程序退出)才关闭它们。您应该始终释放系统资源。


0
关闭您打开的任何文件被认为是一个非常重要的原因,这样您就可以了解到I/O错误并向用户报告。出于同样的原因,如果您向stdout和stderr写入内容,可能是个好主意将其刷新(或者可能关闭)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接