我只是想知道在fd上连续两次关闭的行为是什么。
例如 -
close(fd);
close(fd);
[fd是一个int]
答案 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;
}