Lions' 本読み (100)
file という配列について。定義は unix/file.h Page 1 で以下。
5507 struct file 5508 { 5509 char f_flag; 5510 char f_count; 5511 int f_inode; 5512 char *f_offset[2]; 5513 } file[NFILE]; 5514 /* -------------------------- */
ポイントを以下に控え。
- 配列の各要素は f_count 属性がゼロなら未割り当てと見做される
- open か creat システムコールで配列の要素が割り当て
- 割り当て時、配列要素のアドレスが u.u_ofile の要素に格納
- ユーザプロセスに渡されるのは u.u_ofile のインデクス
- 0, 1, 2 というヤツですな
- 子プロセス (newproc で生成されるオブジェクト) は親プロセスの u.u_ofile 配列を継承
- f_count はそのファイルを参照しているプロセスの数
- newproc, dup, falloc で増分され、closef, open1 によって減分される
- f_inode は inode 配列へのポインタ
- f_offset はファイル内の文字への論理ポインタ
inode 配列
これ、デバイス云々はスルーでシステムの中で一意、になるのかなぁ。ちなみにこの配列の要素数は NINODE で以下な定義。
0131 #define NINODE 100
ファイルが存在しているだけ (未参照) でも以下なリソースが必要とのこと。取得および解放な手続きについても一緒に列挙しておきます。
- ディレクトリエントリ
- namei 手続きで取得、namei 手続きで解放
- ディスク i ノードエントリ
- ialloc 手続きで取得、ifree 手続きで解放
- ディスク記憶装置ブロック
- alloc 手続きで取得、free 手続きで解放
- コア i ノードエントリ
- iget 手続きで取得、iput 手続きで解放
- file テーブルエントリ
- falloc 手続きで取得、closef 手続きで解放
- u_ofile エントリ
- ufalloc 手続きで取得、close 手続きで解放
ファイルのオープンについては次のエントリにて。