ファイルの作成と除去

このセクションでは、ファイルの作成、オープン、クローズ、または除去を行う場合に、オペレーティング・システムが実行する内部プロシージャーについて説明します。

ファイルの作成

次のように、様々なサブルーチンが特定のタイプのファイルを作成します。

サブルーチン 作成するファイルのタイプ
creat 通常のファイル
open 通常のファイル (O_CREAT フラグが設定されている場合)
mknod 通常、先入れ先出し (FIFO)、または特殊
mkfifo 名前付きパイプ (FIFO)
pipe 名前なしパイプ
socket ソケット
mkdir ディレクトリー
symlink シンボリック・リンク

通常のファイルの作成 (creat、open、または mknod サブルーチン)

creat サブルーチンを使用すれば、 Pathname および Mode パラメーターに設定済みの値に従ってファイルを作成することができます。 Pathname パラメーターに指定したファイルが存在し、 プロセスがファイルに対する書き込みアクセス権を持っている場合、 creat サブルーチンはファイルを切り捨てます。 切り捨てによって、すべてのデータ・ブロックが解放され、 ファイル・サイズが 0 に設定されます。 O_CREAT フラグを指定して open サブルーチンを使用しても、 新しい通常のファイルを作成することができます。

creatmkfifo、 または mknod サブルーチンを使用して作成したファイルは、 Mode パラメーターに設定されたアクセス権を引き受けます。 open サブルーチンを使用して作成した通常のファイルは、 O_CREAT フラグの Mode パラメーターからアクセス・モードを引き受けます。 umask サブルーチンは、 プロセスが作成した新しいファイルのファイル・モード作成マスク (アクセス・モードのセット) を設定し、 マスクの以前の値を戻します。

新しく作成したファイルに関するアクセス権ビットは、 umask ビットの反転と作成中のプロセスが設定したファイル作成モード・ビットを AND した結果です。 プロセスが新しいファイルを作成すると、 オペレーティング・システムは以下のアクションを実行します。

  • 作成中のプロセスのアクセス権を判別します。
  • 該当する umask 値を取り出します。
  • umask 値を反転します。
  • AND 操作を使用して、作成中のプロセスのアクセス権と umask 値の反転結果を結合します。

特殊ファイルの作成 (mknod サブルーチンまたは mkfifo サブルーチン)

mknod サブルーチンおよび mkfifo サブルーチンを使用して、新しい特殊ファイルを作成することができます。 mknod サブルーチンは名前付きパイプ (FIFO)、 普通のファイル、およびデバイス・ファイルを処理します。 このサブルーチンは、 creat サブルーチンが作成するファイルと同じファイルの i ノードを作成します。 mknod サブルーチンを使用する場合、 ファイル・タイプ・フィールドは、作成中のファイルのタイプを示すように設定されます。 ファイルがブロックまたは文字型のデバイス・ファイルの場合、 メジャーおよびマイナー・デバイスの名前が i ノードに書き込まれます。

mkfifo サブルーチンは mknod サブルーチンのインターフェースであり、 名前付きパイプを作成するために使用されます。

ファイルのオープン

open サブルーチンは、 プロセスが既存のファイルにアクセスするために必要な最初のステップです。 open サブルーチンは、ファイル・ディスクリプターを戻します。 入出力パラメーターの読み取り、書き込み、シーク、 複製、設定、ファイル状況の判別、およびファイルのクローズはすべて、 open コールによって戻されるファイル・ディスクリプターを使用します。 open サブルーチンは、ファイル・ディスクリプターの割り当て時に、 ファイル・ディスクリプター・テーブル内にファイルに関するエントリーを作成します。

open サブルーチンは次のことを行います。

  • プロセスがファイルにアクセスするための適切なアクセス権を持っているかどうかを検査します。
  • ファイル・ディスクリプター・テーブル内でオープン・ファイルに関するエントリーを割り当てます。 open サブルーチンは、 初期読み取り/書き込みバイト・オフセットを、 ファイルの先頭である 0 に設定します。

ioctl サブルーチンまたは ioctlx サブルーチンは、開いている特殊デバイス・ファイルに対して制御操作を実行します。

ファイルのクローズ

プロセスがオープン・ファイルにアクセスする必要がなくなった場合、 close サブルーチンがそのファイルに関するエントリーをテーブルから除去します。 複数のファイル・ディスクリプターがそのファイルに関するファイル・テーブル・エントリーを参照している場合、 そのファイルの参照カウントが 1 だけ減らされ、 クローズが完了します。 ファイルへの参照が 1 つだけである場合、そのファイル・テーブル・エントリーが解放されます。 切断されたファイル・ディスクリプターをプロセスが使用しようとすると、 別の open サブルーチンがそのファイル・ディスクリプターの値を再び割り当てるまでは、 エラーになります。 プロセスが終了する時、カーネルはそのアクティブ・ユーザー・ファイル・ディスクリプターを調べて、 それぞれを内部でクローズします。 このアクションによって、プロセスの終了前に、すべてのファイルが確実にクローズします。

ファイルの除去

ファイルが必要なくなったら、unlink サブルーチンを使用して、指定したファイルをディレクトリーから除去できます。 同じファイルに対して複数のハード・リンクがある場合は、unlink サブルーチンにより指定したリンクが除去されます。 リンクが 1 つしかない場合は、unlink サブルーチンによりそのファイル自体が除去されます。 詳しくは、unlink サブルーチンを参照してください。