如何在C中确定Linux上给定文件的挂载路径?

时间:2016-11-17 16:06:03

标签: c linux

我有一个任意文件,我想确定挂载点。假设它是/mnt/bar/foo.txt,除了“普通”Linux挂载点之外,我们还有以下挂载点:

[某些设备已安装到] - >到/ mnt /条 [某些设备已安装到] - >的/ mnt /其他

我看过stat()和statvfs()。 statvfs()可以给我文件系统ID,stat可以给我设备的id,但这些都不能真正与挂载点相关联。

我在想我要做的就是在任意文件上调用readlink(),然后读取/ proc / mounts,找出哪个路径与文件名最匹配。这是一个很好的方法,还是有一些很好的libc功能我错过了这个?

1 个答案:

答案 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。它也不是线程安全的。