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

标签 c low-level low-level-code low-level-io

在 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/

相关文章:

c - TickGetDiv256() 是如何工作的?

c - 链表和指针的问题(C)

c - 语言如何处理引擎盖下的打印 float ?

c - 如果 (n!=0) n=0; v/s n=0;哪个更有效,为什么?

c++ - 添加两个无符号字符

c - 使用 void 指针的通用复制

printf 后将变量内容转换为指针结果为 NULL

c - 多个线程调用同一个 rand() 函数,如何让它们调用自己的 rand() 函数实例?

C 代码 - 一种在没有 "if"的情况下将 5 转换为 7 以及将 7 转换为 5 的方法