JFS ディレクトリーの処理

ディレクトリーは、ファイルシステム、リンク・ファイル、および i ノード・サブディレクトリー名に階層構造を提供します。 ネストするディレクトリーの深さに制限はありません。 ディレクトリー用のディスク・スペースは、 4096 バイト・ブロック単位で割り当てられますが、 オペレーティング・システムはディレクトリー・スペースを 512 バイトのレコード単位で割り当てます。

プロセスはディレクトリーを通常のファイルとして読み取ることができます。 ただし、ディレクトリーを作成できるのはカーネルです。 このため、ディレクトリーは、 ディレクトリーに固有のサブルーチンのセットによって作成および管理されます。

JFS ディレクトリー構造

ディレクトリーには一連のディレクトリー・エントリーが入っています。 各ディレクトリー・エントリーには、 3 つの固定長フィールド (ファイルの i ノードに関連する索引番号、ファイル名の長さ、 エントリーのバイト数) およびファイル名を示す 1 つの可変長フィールドがあります。 このファイル名フィールドは null 終了フィールドで、 4 バイトまで埋め込まれます。 ファイル名の長さは、最高 255 バイトです。

ディレクトリー・エントリーは、ファイル名に柔軟性を与えるために可変長です。 ただし、すべてのディレクトリー・スペースは常に割り当てられます。

ディレクトリー・エントリーは、 ディレクトリーの 512 バイトの複数のセクションにまたがることはできません。 ディレクトリーに 513 バイト以上が必要であれば、 もう 1 つの 512 バイトのレコードが元のレコードに付加されます。 割り当てられたデータ・ブロック内のすべての 512 バイト・レコードが使用されている場合、 追加のデータ・ブロック (4096 バイト) が割り当てられます。

ファイルを除去した場合、そのファイルがディレクトリー構造体内で占有していたスペースは、 先行するディレクトリー・エントリーに追加されます。 除去されたディレクトリーに関する情報は、 空になったスペースに新規エントリーが収まるまで存続します。

すべてのディレクトリーには、. (ドット) エントリーと .. (ドット・ドット) エントリーが含まれます。 . (ドット) ディレクトリー・エントリーは、そのディレクトリー自身の i ノードを指します。 .. (ドット・ドット) ディレクトリー・エントリーは、親ディレクトリーの i ノードを指します。mkfs プログラムはファイル・システムを初期化して、新しいルート・ディレクトリーの . (ドット) エントリーと .. (ドット・ドット) エントリーがファイル・システムのルート i ノードを指すようにします。

ディレクトリーには、次のアクセス・モードがあります。

モード 説明
read プロセスが、ディレクトリー・エントリーを読めるようにします。
write プロセスが creatmknodlink、および unlink サブルーチンを使用して、新しいディレクトリー・エントリーの作成または古いディレクトリー・エントリーの除去を行えるようにします。
execute プロセスが、ディレクトリーを現在の作業ディレクトリーとして使用するか、または ファイル・ツリー内の当該ディレクトリーの下を検索できるようにします。

JFS ディレクトリーの処理 (プログラミング)

ディレクトリーの処理に使用できるサブルーチンのリストは、次のとおりです。
closedir
ディレクトリー・ストリームをクローズし、DirectoryPointer パラメーターに関連した構造を解放します。
mkdir
ディレクトリーを作成します。
opendir
DirectoryName パラメーターによって指定されたディレクトリーをオープンし、そのディレクトリーにディレクトリー・ストリームを関連付けます。
readdir
次のディレクトリー・エントリーを指すポインターを戻します。
rewinddir
指定されたディレクトリー・ストリームの位置をディレクトリーの先頭にリセットします。
rmdir
ディレクトリーを除去します。
seekdir
ディレクトリー・ストリーム上で次の readdir サブルーチン操作の位置を設定します。
telldir
指定されたディレクトリー・ストリームに関連した現在の位置を戻します。

プロセスの現行ディレクトリーの変更

システムをブートすると、最初のプロセスは、現在のディレクトリーとして、 ルート・ファイルシステムのルート・ディレクトリーを使用します。 fork サブルーチンで作成された新規プロセスは、親プロセスで使用される現行ディレクトリーを継承します。 chdir サブルーチンはプロセスの現行ディレクトリーを変更します。

chdir サブルーチンは、 パス名を構文解析して、ターゲット・ファイルがディレクトリーであること、 およびプロセスのオーナーが当該ディレクトリーに対する許可を持っていることを確認します。 chdir サブルーチンの実行後、プロセスは新しい現在のディレクトリーを使用して、 / (スラッシュ) で始まらないすべてのパス名を検索します。

プロセスのルート・ディレクトリーの変更

chroot サブルーチンを使用すると、プロセス Path パラメーターによって指定されたディレクトリーを実効ルート・ディレクトリーにすることができます。 コール側のプロセスの子プロセスは、chroot サブルーチンが示すディレクトリーをファイルシステムの論理ルート・ディレクトリーと見なします。

プロセスは、/ (スラッシュ) で始まるすべてのパス名に関して、グローバルなファイルシステムのルート・ディレクトリーを使用します。 / (スラッシュ) で始まるすべてのパス名の検索は、この新規ルート・ディレクトリーから開始されます。

JFS ディレクトリーを制御するサブルーチン

ディレクトリー・ファイルに固有な性質のために、 ディレクトリーはサブルーチンの特殊なセットによって制御します。 ディレクトリーを制御するために、 以下のサブルーチンが用意されています。

chdir
現在の作業ディレクトリーを変更します。
chroot
実効ルート・ディレクトリーを変更します。
getcwd または getwd
現在のディレクトリーへのパスを獲得します。
mkdir
ディレクトリーを作成します。
opendirreaddirtelldirseekdirrewinddir、または closedir
ディレクトリーに様々なアクションを実行します。
rename
ディレクトリーの名前を変更します。
rmdir
ディレクトリーを除去します。