c - 如何检查一个文件是否已经在C中打开

标签 c linux

我在一个多线程系统上工作,其中一个文件可以根据文件访问权限在不同线程之间共享。

如何检查文件是否已被另一个线程打开?

最佳答案

查明指定文件是否已在 上打开,您可以扫描 /proc/self/fd 目录以查看该文件是否与文件描述符相关联。下面的程序勾勒出一个解决方案:

DIR *d = opendir("/proc/self/fd");
if (d) {
    struct dirent *entry;
    struct dirent *result;

    entry = malloc(sizeof(struct dirent) + NAME_MAX + 1);
    result = 0;
    while (readdir_r(d, entry, &result) == 0) {
        if (result == 0) break;
        if (isdigit(result->d_name[0])) {
            char path[NAME_MAX+1];
            char buf[NAME_MAX+1];
            snprintf(path, sizeof(path), "/proc/self/fd/%s",
                     result->d_name);
            ssize_t bytes = readlink(path, buf, sizeof(buf));
            buf[bytes] = '\0';
            if (strcmp(file_of_interest, buf) == 0) break;
        }
    }
    free(entry);
    closedir(d);
    if (result) return FILE_IS_FOUND;
}
return FILE_IS_NOT_FOUND;

从你的评论来看,你想要做的似乎是检索一个现有的 FILE *,如果它已经由之前调用 fopen() 创建文件。标准 C 库没有提供遍历所有当前打开的 FILE * 的机制。如果有这样的机制,你可以用fileno()导出它的文件描述符,然后用readlink()查询/proc/self/fd/# 如上所示。

这意味着您将需要使用数据结构来管理您打开的 FILE *。使用文件名作为键的哈希表可能对您最有用。

关于c - 如何检查一个文件是否已经在C中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18648291/

相关文章:

通过删除重复的子字符串来组合两个字符串

c - 以下代码中 if(len ....) 的含义/逻辑是什么?

c - fork 返回的到底是什么?

javascript - 将 Javascript Web 应用程序转移到 Linux 应用程序

linux - Logrotate 脚本仅在手动执行期间正确触发

c - 操作 char[] 并将结果包含在头文件中

c - 求余运算符在 C 语言中的工作原理

java - 基于 java-eclipse linux 的 Opencv native 位置设置

c++ - 使用 g++ 的 Glibc 问题

将 double 或 float 转换为整数类型,哪种类型?