プロセスを分岐すると、子プロセスは親プロセスのファイル記述子を継承します。私が知る限り、これが起こると、子プロセスは、同じ開かれたファイル記述を指す各ファイル記述子テーブルへのポインタと共に、親プロセスのファイル記述子テーブルのコピーを受け取ります。これは、次のファイルテーブルと同じですか?http://en.wikipedia.org/wiki/File_descriptor、または他のものか。
ベストアンサー1
ファイル記述子→オープンファイルの説明→ディレクトリエントリ
dup
open
cp
プロセスで開かれたファイルからファイルの内容まで、複数レベルの間接参照があります。実装面では、これらのレベルは通常、次のレベルを指すカーネルのデータ構造に変換されます。簡単な実装について説明します。実際の実装はより複雑になる可能性があります。
プロセスで開かれたファイルは、負の非整数のファイル記述子によって指定されます。数字0、1、2は一般的な意味を持ちます。プロセスは0(標準入力)から一般入力を読み、1(標準出力)に一般出力を書き、2(標準エラー)にエラーメッセージを書き込む必要があります。これは単なる慣例です。カーネルは気にしません。カーネルは、各プロセスに対して開かれたファイル記述子テーブルを保持することによって、これらの小さな整数をファイル記述子構造。 Linuxカーネルでは、この構造は次のとおりです。struct fd
。
ファイル記述子構造には、以下を指すポインターが含まれています。ファイル説明を開く。プロセス呼び出しなど、複数のプロセスで同じオープンファイル記述を指す複数のファイル記述子があります。dup
友人と一緒にまたはプロセスフォークの後。ファイル記述子(他のプロセスでも)がopen
同じ元の(または同様の)システムコールによって発生した場合は、同じオープンファイル記述を共有します。開かれたファイルの説明には、モード(読み取り専用と読み取り/書き込み、追加など)、ファイル内の場所などを含む、ファイルの開き方に関する情報が含まれます。 Linuxで開かれたファイル記述構造は次のとおりです。struct file
。
開かれたファイル記述はファイルAPIレベルにあります。次のレベルはファイルシステムAPI違いは、ファイルAPIが匿名パイプやソケットなど、ファイルシステムツリーに存在しないファイルを扱うことです。ファイルがディレクトリツリーのファイルの場合、開かれたファイルの説明には、次を指すポインタが含まれます。ディレクトリエントリ。同じファイルをopen
複数回編集する場合は、同じディレクトリエントリを指す複数の開いているファイルの説明があります。ディレクトリエントリには、親ディレクトリへのポインタ、ファイルの場所に関する情報など、ファイルの内容に関する情報が含まれます。 Linuxカーネルでは、ディレクトリエントリは2つのレベルに分けられます。struct inode
ファイルメタデータを含むstruct dentry
ディレクトリツリー内のファイルの場所を追跡します。