我在一个多线程系统上工作,其中一个文件可以根据文件访问权限在不同线程之间共享。
如何检查文件是否已被另一个线程打开?
最佳答案
查明指定文件是否已在 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/