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 手続きで解放

ファイルのオープンについては次のエントリにて。