Linux カーネルは、オープンファイルをファイル記述子テーブルのエントリ、v-node テーブルのエントリ、およびオープンファイルテーブルのエントリとして表します。
Linuxカーネルは開いたディレクトリを同じように表示しますか?
おそらくそうではありません。なぜディレクトリが次のように開くのかを知りたいからです。
DIR *opendir(const char *pathname);
ファイルが開いたら:
int open(const char *path, int oflag, ... /* mode_t mode */ );
おそらくそうです。なぜなら
DIR *fdopendir(int fd);
開いたファイル記述子をDIR構造に変換します。それでは、open()
ファイルのようにディレクトリを開き、ファイル記述子を返すことができる関数(?)がありますかfd
?
opendir()
open()
まず、ディレクトリのファイルディスクリプタをインポートしてから、ファイルディスクリプタまたはそれfdopendir()
に対応するエントリを呼び出すことによって達成されますか?
ありがとうございます。
答え1
opendir
コールバックopen
のように内部的にシステムコールを呼び出すライブラリ関数です。ファイルストリームへのポインタを返すのと同様に、ディレクトリストリームへのポインタを返します。必要に応じて、ディレクトリから直接システムコールを使用することもできます。fopen
open
opendir
DIR
fopen
FILE
open
答え2
open()
それでは、ファイルなどのディレクトリを開き、ファイル記述子fdを返すことができる関数(?)がありますか?
はい、次のコマンドを使用してディレクトリを開くことができますopen()
ファイル記述子を取得します。 openat()
.
read()
Linuxではディレクトリ内からアクセスできませんが、EISDIR
(「ディレクトリです」)を返します。代わりにカーネルにgetdents()
オープンディレクトリからディレクトリエントリを読み取るシステムコール。混乱しても古いものもありますreaddir()
同じ名前のPOSIX関数とは異なるシステムコール(最新のアーキテクチャにはありません)
マニュアルページに示すように、getdents()
glibcはそれにラッパーを提供しないため、次のようにする必要があります。POSIXreaddir()
代わりに機能opendir()
を実行します。はい。内部的にopendir()
使用される場合、open()
Cライブラリは標準APIとDIR *
。
他の一部のUnixファミリーシステムでは、ファイルのリストを取得read()
するために別のシステムコールを使用する代わりに(または追加?)ディレクトリが許可することがわかっています。
Linuxopen()
O_DIRECTORY
指定されたファイルがディレクトリでない場合に開くことを失敗させるフラグもありますが、そのファイルの使用は必須ではありません。