3

在 Unix C 编程中,在进程退出之前显式关闭文件句柄是否被认为是一种好习惯,或者让操作系统关闭文件句柄从而避免不必要的代码是否是一种好习惯?

这两者中的哪一个通常被认为是首选的选择?

例子:

int main (int argc, char* argv[])
{
    int sd;
    sd = socket(...);

    // Snip

   close(sd); // Good or bad practice?
   return 0;
}
4

7 回答 7

10

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

即使代码驻留在顶级 main() 函数中,万一代码被重用,它仍然是一个好主意。

于 2009-01-19T14:50:30.617 回答
5

自己关闭它们被认为是一种很好的做法。

可能是因为这是一个好习惯,以防在您完成使用特定“文件”后的一段时间内您的程序增长并且退出不会发生。

例外是您的进程未打开的标准输入、标准输出和标准错误。

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

于 2009-01-19T14:49:09.777 回答
2

如果可以的话,绝对是关闭它们的好习惯。

如果您的程序发生更改以使文件尽快关闭而不是稍后关闭,则您无需记住close()稍后在文件 I/O 重构时添加它。

于 2009-01-19T14:49:12.320 回答
2

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

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

希望你觉得这有帮助,

于 2009-01-19T14:49:37.263 回答
1

如果您的程序将继续运行但不再需要描述符,那么关闭描述符是非常好的做法。

再说一次,它取决于文件描述符类型。例如,关闭()套接字将刷新它,如果失败,您可能需要重试。

于 2009-01-19T14:48:57.640 回答
0

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

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

于 2009-01-19T15:00:27.367 回答
0

关闭您打开的任何文件被认为是好的最重要的原因是,您可以发现 I/O 错误并将其报告给用户。出于同样的原因,如果您写入 stdout 和 stderr,则刷新(或可能关闭)它们可能是一个好主意。

于 2009-01-19T15:38:38.757 回答