ファイルのクローズ

ファイル構造体の解放と、iノードの解放 削除がからむと少々ややこしい。(前述)

ファイルのクローズシステムコール vfs sys_close関数では、ファイルディスクリプタに対応したファイル構造体をファイルディスクリプタテーブルから登録を抹消する。その後、filp_close関数を用いてファイルのクローズ処理を実行する。

forkしたプロセス間ではファイル構造体を共有しているため、本当のクローズ処理が行われるのは、最後のプロセスがクローズを呼び出したときである。

クローズ処理は、明示的なシステムコール呼び出し以外にも、プロセスの終了時やexec時にも呼び出される。

   filp_close(ファイル構造体, スレッドグループID)
        ファイル構造体に登録されているflushオペレーションを呼び出す。
        if(ファイルがロックされていたら)
              ロックを解除する(locks_remove_posix関数)
        ファイル構造体の解放(fput関数)

   fput(ファイル構造体)
        ファイル構造体の参照数を1減らす
        if(ファイル参照数が0になったら) {
             ファイルロックの解除(locks_remove_flock関数)
             ファイルオペレーションreleaseを呼び出す。
             dentryの解放(dput関数)
             ファイル構造体の解放(remove_filp関数, insert_file_free関数)
        }

ext2ファイルシステムの通常ファイルでは、ファイルオペレーションreleaseには、ext2_discard_prealloc関数が登録されている。これは先行確保したファイルのデータブロックをフリービットマップに返却する関数である。ext2ファイルシステムのディレクトリ、シンボリックリンクファイルにはオペレーションは登録されていない。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1