8

Linux 2.6.39ではO_PATHオープンモードが導入されました。これは(大まかに言えば)ファイルをまったく開かない(つまり、開いているファイルの説明を作成しない)が、開いていないターゲットへのハンドルであるファイル記述子を提供するだけです。その主な用途は*at関数(など)への引数としてであり、 Linuxが以前に欠けていopenatたPOSIX2008機能の実装として適しているようです。O_SEARCHただし、の正確なセマンティクスに関する適切なドキュメントを見つけることができませんでしたO_PATH。私が持っているいくつかの特定の質問は次のとおりです。

  1. O_PATHLinuxファイル記述子ではどのような操作が可能ですか?(*at機能のみ?)
  2. O_PATHディレクトリ以外で役立つことはありますか?
  3. ファイル記述子は基になるファイルシステムオブジェクトにどのようにバインドされ、移動、削除などされた場合はどうなりますか?O_PATHファイル記述子は、最後のリンクがリンク解除されたときにオブジェクトが解放されるのを防ぐ参照としてカウントされますか?等。
4

1 に答える 1

7

を使用して取得したファイル記述子は、関数open(directory, O_PATH | O_DIRECTORY)だけでなく、 (カーネルバージョン3.2.23以降)にも役立ちます。...at()fchdir()

非常に長いUnixドメインソケット名を許​​可する新しいsyscallの最近のパッチもあります。fbind()ソケットファイルは、最初にを使用して作成されmknod(path, mode | S_IFSOCK, (dev_t)0)、次にを使用して開かれopen(file, O_PATH)ます。このようにして取得されたファイル記述子とUnixドメインソケット記述子がに渡されfbind()、ソケットがパス名にバインドされます。これがLinuxカーネルに含まれるかどうかはまだわかりませんが、含まれているとしても、世界中で利用できるようになるまでには何年もかかるでしょう。(ただし、長すぎるUnixドメインソケット名の回避策として、より早く実行可能になります。)

O_PATH今のところ、ディレクトリにのみ役立つと思います。ファイルの使用は将来見つかるかもしれません。将来の可能性fbind()、または同様の将来のシステムコールを除いて、を使用して開かれたファイルのファイル記述子の使用については知りませんO_PATHfstatvfs()少なくとも3.5.0カーネルでは機能しません 。

Linuxでは、iノード(ファイルの内容とメタデータ)は、最後に開いたファイル記述子が閉じられたときにのみ解放されます。ファイルを削除(リンク解除)するときは、iノードに関連付けられているファイル名のみを削除します。したがって、ファイル記述子に関連付けられた2つの別個のファイルシステムオブジェクトがあります。オブジェクトを開くために使用される名前と、参照される基になるiノードです。この名前は、パス解決、つまりopen()(または同等の)が呼び出された場合にのみ使用されます。すべてのデータとメタデータはiノードにあります。

O_PATH(少なくともカーネル3.5.0では)通常のファイル記述子と同じように動作することを使用して取得されたファイル記述子。記述子を開くために使用される1つまたは複数の名前コンポーネントを移動して名前を変更します。(記述子はiノードを参照するため有効なままであり、ファイル名オブジェクトはパス解決中にのみ使用されました。記述子を開いたままにすると、記述子が開かれた場合でも、iノードリソースが割り当てられたままになりO_PATHます。)

于 2012-09-14T11:12:21.200 に答える