ファイル
UNIXにおけるファイルは、バイトの列として構造化された情報の入れ物です。カーネルはファイルの内容には関与せず、データの管理のみを行います。ファイルの扱いをより抽象化するため、多くのライブラリがレコードの構造化 や キーによるレコード参照などの機能を提供しています。ただし、これらのライブラリはすべてカーネルが提供する システムコールに依存しています。
UNIXのファイルシステムでは、ファイルは ツリー構造の名前空間に整理されます。このツリーの各ノードはディレクトリを表し、葉ノードが通常のファイルです。ディレクトリには、直下にあるファイルや他のディレクトリの情報 が格納されます。
ファイル名とディレクトリ名には ASCII 文字列を使用でき、「/」(スラッシュ)と NULL 文字('\0') を除く任意の文字が利用可能です。ほとんどのファイルシステムでは、ファイル名の最大長は 255 文字以内 に制限されています。
ツリー構造の最上位に位置するディレクトリはルートディレクトリ(/(スラッシュ))と呼ばれます。同じディレクトリ内では 重複する名前を持つファイルやディレクトリは作成できません が、異なるディレクトリであれば同じ名前を使用できます。
作業ディレクトリとパス名
UNIX では、各プロセスに作業ディレクトリ(カレントディレクトリ)が設定されています。これはプロセスの実行コンテキストの一部であり、プロセスが現在使用しているディレクトリを示します。ファイルを指定する際には パス名 を用い、パス名はディレクトリの階層をスラッシュ(/)で区切った文字列 になります。
パス名には 絶対パス名 と 相対パス名 の 2 種類があります。
- 絶対パス名 :パスの先頭がスラッシュ(/)で始まり、ルートディレクトリを起点 にファイルを指定する
- 相対パス名 :パスの先頭にスラッシュがなく、作業ディレクトリを起点 にファイルを指定する
また、特別なディレクトリ名として 「.」 と 「..」 があります。
- 「.」(ドット):現在の作業ディレクトリを示す
- 「..」(ドット二つ):親ディレクトリを示す
作業ディレクトリがルートディレクトリ(/)の場合、「..」 もルートディレクトリを指します。
ハードリンクとソフトリンク
UNIX のファイルシステムでは、ディレクトリ内のファイルを ハードリンク(または単に リンク)と呼びます。
1 つのファイルは、同じディレクトリ内または異なるディレクトリ内に 複数のハードリンク を持つことができます。つまり、1 つのファイル実体に対して複数のファイル名を持たせることが可能 です。
次の UNIX コマンドは、パス名 p1 で識別されるファイルに対し、パス名 p2 の新しいハードリンクを作成します。
$ ln p1 p2
ハードリンクの制限
ハードリンクには、次の 2 つの重要な制限があります。
ディレクトリのハードリンクは作成できない
これは、ディレクトリツリーが循環グラフになり、ファイルの正しい位置を特定できなくなるのを防ぐため です。
異なるファイルシステムをまたぐハードリンクは作成できない
ハードリンクは、同じファイルシステム内のファイルに対してのみ作成可能 です。
これは UNIX の設計上の制約であり、近代的な UNIX システムでは 異なるディスクやパーティションにまたがる複数のファイルシステム が存在する可能性があるため、
ユーザが意識せずに異なるファイルシステム上のファイルをリンクしようとすると失敗することになります。
ソフトリンク(シンボリックリンク)
ハードリンクの制限を克服するために導入されたのが ソフトリンク(シンボリックリンク)です。
シンボリックリンクは、他のファイルへのパス名を保持する小さなファイル です。これにより、以下のような特徴を持ちます。
- 異なるファイルシステム上のファイルやディレクトリにもリンクできる
- ディレクトリに対してもリンクを作成できる
- 存在しないファイルを指し示すことも可能(破損リンク / デッドリンク)
次の UNIX コマンドを使用すると、パス名 p1 を指す パス名 p2 の新しいソフトリンク を作成できます。
$ ln -s p1 p2
このコマンドを実行すると、ファイルシステムは p2 のディレクトリ部分を取り出し、そのディレクトリ内に シンボリックリンク型のエントリを作成します。
こうして、p2 へのアクセスは 自動的に p1 への参照へと変換されます。
ファイルの種類
UNIX におけるファイルは、次のいずれかの種類に分類されます。
- 通常ファイル
- ディレクトリ
- シンボリックリンク
- ブロック型デバイスファイル
- キャラクタ型デバイスファイル
- パイプ(名前付きパイプ / FIFO)
- ソケット
各ファイルの概要
- 通常ファイル、ディレクトリ、シンボリックリンク は、すべての UNIX ファイルシステムでサポートされる基本的なファイルタイプです。
- デバイスファイル(ブロック型 / キャラクタ型) は、I/O デバイスへのアクセスを抽象化する特殊なファイルです。プログラムがデバイスファイルを操作すると、対応するハードウェアデバイスに直接アクセス することになります。
- パイプ(FIFO)とソケット は、プロセス間通信(IPC) に使用される特殊なファイルです。
免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。