ファイルまたはディレクトリへのパスが与えられた場合、そのファイルのマウント ポイントを特定するにはどうすればよいですか? たとえば、がファイルシステム/tmp
としてマウントされている場合tmpfs
、ファイル名が指定されている場合、それがルート/tmp/foo/bar
の に保存されていることを知りたいです。tmpfs
/tmp
これは C++ で行われ、system()
. コードは堅牢である必要があります。必ずしも意図的な改ざんに対してではなく、ネストされたマウントポイントやシンボリック リンクなどに直面しても確実に対処する必要があります。
これを行うための単純なシステム コールを見つけることができませんでした。自分で小切手を書かなければならないようです。これが私が計画していることの大まかな概要です。
readlink
シェル コマンドでファイル名を正規化します。どのように?- & co
/etc/mtab
で読むgetmntent()
- ファイルに対応するマウント エントリを特定します。どのように?
#1には単純なシステムコールがありますか、それともパスの各ディレクトリコンポーネントを読み取り、readlink(2)
シンボリックリンクの場合は解決する必要がありますか? そしてハンドル.
と..
自分?痛そうです。
#3については、これを行う方法についてさまざまなアイデアがあります。どれが一番いいかわからない。
open()
ファイル、その親、その親の親など、いずれかのエントリopenat(fd, "..")
に到達するまで使用します。/etc/mtab
(どのようにすればわかりますか?fstat()
それらを調べて inode 番号を比較しますか? )- 私のファイル名の部分文字列であるマウントテーブルで最長のディレクトリ名を見つけます。
私は最初のオプションに傾いていますが、すべてをコーディングする前に、何も見落としていないことを確認したいと思います-理想的には、これを既に実行している組み込み関数です!