gpt4 book ai didi

c - 如何检查文件描述符是否已关闭?

转载 作者:太空狗 更新时间:2023-10-29 17:21:25 25 4
gpt4 key购买 nike

在 POSIX 环境中,当使用系统调用来操作文本文件时(open(), close(), read(), write()),有没有办法检查是否我实际上在使用 close(file_descriptor) 时关闭了一个文件描述符?

示例:

int main(int argc, char **argv)
{
int input_file; // file descriptor for input file
int output_file; // file descriptor for output file
input_file = open(argv[1], O_RDONLY));
ouput_file = open(argv[2], ...file properties & permissions and crap.....);

// blah blah blah...

close(input_file);
close(output_file);

// what can I code here to check if the file descriptor was actually closed?
}

最佳答案

最简单的方法可能是只检查第一个 close 的返回值。

if (close(input_file)) {
perror("close");
} else {
// all good
}

这是唯一线程安全的方法。在多线程程序中,另一个线程可以获得一个新的文件描述符,该文件描述符回收刚刚关闭的文件描述符。


仅在单线程代码中,在关闭和检查之间没有任何东西可以回收 fd:

如果你想在之后检查文件描述符是否有效,那么你可以使用任何使用文件描述符的函数并检查它的错误代码。最无干预且重量最轻的可能是 fcntl/F_GETFL

if (fcntl(fd, F_GETFL) < 0 && errno == EBADF) {
// file descriptor is invalid or closed
}

您也可以再次调用 close,它也可能因 EBADF 而失败。

if (close(fd) && errno == EBADF) {
// file descriptor is invalid or closed
} else {
// we successfully closed fd *now* (e.g. first close failed with EINTR)
// or there was a different error
}

close 不会在成功时修改 errno,但我们只会在 close 返回非-时读取 errno零,表示已设置。

关于c - 如何检查文件描述符是否已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19660389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com