Linux上のファイルのOpenとClose処理について考えてみた。

プログラムを実行すると、そのプログラムが扱うファイル情報のための領域が確保されます。この領域はリスト形式で複数個、用意されます。このリストを利用者ファイル記述子表と呼んでいます。C言語でfopen関数を呼ぶとファイルポインタが返りますが、このファイルポインタは利用者ファイル記述子表のどの場所かを示すポインタとなります。またopenシステムコールを呼んだ場合はファイル記述子(ファイルディスクリプターとも呼ぶ)が返りますが、ファイル記述子はリストの何番目かを示す配列の番号です。

※上の絵のfdはファイルディスクリプターの略、fpはファイルポインタの略です。

標準入力、標準出力、標準エラー出力はプログラム実行時に自動的に割り当てられるファイル情報の領域で、ファイル記述子はそれぞれ、0、1、2 と決まっています。通常、標準入力はキーボード、標準出力、標準エラー出力は端末の画面となります。

ここで新規にファイルを作成する場合を考えてみます。ファイル記述子は3以降が使われます。openシステムコールを新規作成で呼ぶと以下の領域が確保されます。

  • プログラム内のファイル記述子表に新規ファイル分を追加
  • ファイルシステムのiノードリストに新規ファイル分を追加
  • ファイルアクセスのための入出力用バッファを用意

絵に書くと以下のような感じです(iノードについては前回前々回を参照ください)。

ファイルのOPENにより利用者ファイル記述子表とiノードリストの紐付けを行っています。これによりファイル記述子からファイルのアクセス権の設定やファイルの読み出し/書き込みが行えることになります。またファイルのCLOSEを行うことにより利用者ファイル記述子表とiノードリストの紐付きを解除しています。

ちなみに、別々のプログラムが同一ファイルをOPENして読み書きを行う場合(共通のログファイルへの書き出しなど)は以下のような絵になると思います。

同一ファイルへのアクセスでも利用者ファイル記述子表のファイル記述子は(プログラム内で保持するため)別々のものとなります(たまたま同じになるときももちろんあります)。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です