我有一个任意文件,我想确定挂载点。假设它是/mnt/bar/foo.txt,除了“普通”Linux挂载点之外,我们还有以下挂载点:
[某些设备已安装到] - >到/ mnt /条 [某些设备已安装到] - >的/ mnt /其他
我看过stat()和statvfs()。 statvfs()可以给我文件系统ID,stat可以给我设备的id,但这些都不能真正与挂载点相关联。
我在想我要做的就是在任意文件上调用readlink(),然后读取/ proc / mounts,找出哪个路径与文件名最匹配。这是一个很好的方法,还是有一些很好的libc功能我错过了这个?
答案 0 :(得分:2)
您可以使用getfsent
的组合来遍历设备列表,并stat
检查您的文件是否在该设备上。
#include <fstab.h> /* for getfsent() */
#include <sys/stat.h> /* for stat() */
struct fstab *getfssearch(const char *path) {
/* stat the file in question */
struct stat path_stat;
stat(path, &path_stat);
/* iterate through the list of devices */
struct fstab *fs = NULL;
while( (fs = getfsent()) ) {
/* stat the mount point */
struct stat dev_stat;
stat(fs->fs_file, &dev_stat);
/* check if our file and the mount point are on the same device */
if( dev_stat.st_dev == path_stat.st_dev ) {
break;
}
}
return fs;
}
注意,为简洁起见,那里没有错误检查。 getfsent
也不是POSIX函数,但它是一种非常广泛使用的约定。它适用于OS X,它甚至不使用/etc/fstab
。它也不是线程安全的。