を使用して取得したファイル記述子は、関数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_PATH
。fstatvfs()
少なくとも3.5.0カーネルでは機能しません 。
Linuxでは、iノード(ファイルの内容とメタデータ)は、最後に開いたファイル記述子が閉じられたときにのみ解放されます。ファイルを削除(リンク解除)するときは、iノードに関連付けられているファイル名のみを削除します。したがって、ファイル記述子に関連付けられた2つの別個のファイルシステムオブジェクトがあります。オブジェクトを開くために使用される名前と、参照される基になるiノードです。この名前は、パス解決、つまりopen()
(または同等の)が呼び出された場合にのみ使用されます。すべてのデータとメタデータはiノードにあります。
O_PATH
(少なくともカーネル3.5.0では)通常のファイル記述子と同じように動作することを使用して取得されたファイル記述子。記述子を開くために使用される1つまたは複数の名前コンポーネントを移動して名前を変更します。(記述子はiノードを参照するため有効なままであり、ファイル名オブジェクトはパス解決中にのみ使用されました。記述子を開いたままにすると、記述子が開かれた場合でも、iノードリソースが割り当てられたままになりO_PATH
ます。)