关闭无效的文件描述符会发生什么?

9

我有一些遗留代码,它在很多地方都这样做:

int fd; // open a file 

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

我认为这看起来非常不对。

关闭一个无效的文件描述符是有效的吗?


这对我来说看起来非常不对。同意。那段代码背后的“思考”肯定很有趣。 - Andrew Henle
3个回答

9
根据手册:
当成功完成时,返回值为0。否则,返回-1,并设置全局整数变量errno以指示错误。
然后:
 The close() system call will fail if:

 [EBADF]            fildes is not a valid, active file descriptor.
那么就不会发生任何有害的事情。

5

它返回一个错误代码。虽然没有任何问题,但也没有用处,因为无论如何都没有对return值进行检查。

引用 man页面

返回值

close()在成功时返回零。发生错误时,将返回-1,并适当设置errno。

错误

EBADF
fd不是有效的打开文件描述符。


0
请注意,在Windows MSVC中,使用无效的fd调用close会通过断言导致abort()发生。检查fd是否大于或等于0且小于某个魔术数字“nhandle”(在我的系统上该值为64),甚至没有异常可以捕获,也不会返回-1。它只是崩溃了。
您将得到类似于这样的东西(截图感谢我的库的一位用户):

enter image description here


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