2016-11-17 7 views
2

私は、マウントポイントを決定したい任意のファイルを持っています。 「通常の」Linuxマウントポイントに加えて、次のマウントポイントを持つ/mnt/bar/foo.txtとしましょう:CでLinux上の特定のファイルのマウントパスを調べるにはどうすればよいですか?

[デバイスがマウントされている] - >/mnt/bar [いくつかのデバイスが]にマウントされました - >/mnt/other

私はstat()とstatvfs()を見てきました。 statvfs()は私にファイルシステムIDを与えることができ、statは私にそのデバイスのIDを与えることができますが、これらのどちらもマウントポイントに本当に関連付けることはできません。

私は、任意のファイルに対してreadlink()を呼び出してから、/ proc/mountsを読み込み、ファイル名に最も近いパスを調べることを考えています。これは良いアプローチですか、それとも素晴らしいlibc関数がありますか?

+0

http://unix.stackexchange.com/questions/90252/how-to-get-mount-point-of-filesystem-containing-given-file – staringlizard

+0

該当しません。これはLinuxのユーティリティー・プログラムを使用していないC言語で行っていますが、これらのプログラムを呼び出すために/ execまたはsystem()をforkするつもりはありません。私はこれらのプログラムのソースコードを見ることができます。 – Maxthecat

答えて

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関数ではありませんが、非常に広く使用されています。それは/etc/fstabを使用しないOS Xでもここで動作します。スレッドセーフでもありません。

+0

ありがとう! getmntent()はPOSIXであり、使用することもできます。 – Maxthecat

+0

@Maxthecat 'getmntent'はPOSIXで、BSD(またはOS X)には存在しません。 BSDには 'getmntinfo'と' getfsstat'があります。それらはPOSIX 2または3関数かもしれませんが、私はそのためのドキュメントを持っていません。 – Schwern

関連する問題