对同一个函数中的一个fd进行多次关闭调用是否重要?

时间:2012-10-08 13:28:32

标签: c file file-io

我只是想知道在fd上连续两次关闭的行为是什么。

例如 -

close(fd);
close(fd);

[fd是一个int]

5 个答案:

答案 0 :(得分:15)

第一个电话应该返回0;第二个调用应返回-1,并将errno设置为EBADF

您应该通过将fd设置为已知的错误号码来阻止第二次通话,例如第一次致电-1后立即close,然后在拨打第二个电话之前检查fd(如果fd-1则不接听电话) :

close(fd);
fd = -1;
...
// More code
...
if (fd != -1) {
    close(fd)
    fd = -1;
}

当您需要从多个地方拨打close时,此代码模式会有所帮助,但您不确定该文件是否已打开,或者该文件是否已关闭。将-1传递给close是无害的(当然,你会获得EBADF

答案 1 :(得分:8)

除非你在两次关闭调用之间进行线程化或做某事,否则它应该是无害的。然后你最终可能会关闭一个fd,程序中的其他内容已经打开了。

线程的相关方式是图书馆几乎总是在你背后做一些奇怪的事情。 Libc将打开文件以查找错误消息或其他依赖于语言环境的东西,解析器可以打开配置文件等。如果您关闭文件描述符并再次关闭它,在线程环境中您很容易就会遇到文件的情况描述符已被库重用,您可以在它后面关闭它。

答案 2 :(得分:5)

关闭相同的 fd两次应该是非致命的,正如其他人所指出的那样,但要小心这样的代码

close(fd);
/* ... */
newfd = open(....);
/* ... */
close(fd);

在第二次结束时,您无法确定fd是否与newfd实际相同!每当您尝试使用newfd时,这都会导致崩溃。

所以(如果两个close次调用之间存在代码),这样做是不安全的。始终close文件描述符只需一次。始终free只缓冲一次。

答案 3 :(得分:3)

第二次通话将在Errno: EBADF时失败      因为到那时, fd不是活动文件描述符。

执行时应该没有任何影响。但是,如果第一次关闭设置了任何错误号,那么它将丢失,因此您不应该关闭文件描述符两次。

答案 4 :(得分:1)

如果fd的值保持不变,则第二次调用将返回fd无效的错误(EBADF - 如dasblinkenlight所指出的那样)

想想做某事喜欢

if fd != -1 )
{
   close (fd );
   fd = -1;
}