UNIXファイルタイプ

**UNIXファイルタイプ**（UNIX file types）とは、UNIXが識別するファイルの種別のことであり、POSIXに規定される標準のUNIXファイルタイプは、*regular*（一般）、*directory*（ディレクトリ）、*symbolic link*（シンボリックリンク）、*FIFO special*（名前付きパイプ）、*block special*（ブロックデバイスファイル）、*character special*（キャラクタデバイスファイル）、*socket*（ソケット）の7種類である。OSの実装によっては、これよりも多くのファイルタイプが使用できる（Solarisのなど）。ファイルタイプは<code>ls -l</code>コマンドで識別できる。このコマンドは、ファイルパーミッションフィールドの1文字目にファイルタイプを表示する。

通常(regular)のファイルの場合、UNIXのシステムではファイルの内部構造を解釈しないため、その構造と解釈はそれを使用するソフトウェアに完全に依存する。ただし、<code>file</code>コマンドを使用して、含まれるデータのタイプを判別することができる。

## モード文字列
`ls -l`コマンドの実行例を以下に示す。
 drwxr-xr-x 2 root root     0 Jan  1  1970 home

`ls -l`コマンドで出力されるlsコマンドの長い形式の出力形式はPOSIXで規定されている。最初のフィールドはファイルモード文字列(file mode string)と呼ばれ、その1文字目はファイルタイプを表す。残りの文字列はファイルパーミッションを表す。

従って、上記の例ではファイルモード文字列は`drwxr-xr-x`であり、ファイルタイプは`d`（ディレクトリ）、ファイルパーミッションは`rwxr-xr-x`である。

内部的には、`ls`は、ファイルに関連する`stat`構造を取得して、`mode_t`フィールドを人が読める形に変換する。`mode_t`は、実際には2つの部分を持つビットフィールドであり、ファイルタイプは`S_IFMT`マスク内に保存されている。`S_ISDIR`（マスク`S_IFMT`の`S_IFDIR`値）のようないくつかのマクロでテストして、ファイルタイプフラグを取得する。

### 実装の例
GNU coreutilsバージョンの`ls`は、モード文字列の取得にGNU Cライブラリ（Gnulib）の関数である`filemode()`の呼び出しを使用する。

FreeBSDはよりシンプルなアプローチを使用するhが、使用できるファイルタイプの数は少なくなる。

## 一般ファイル
一般ファイルは、モード文字列の1文字目に`'''-'''`（ハイフン）が表示される。

 $ ls -l /etc/passwd
 **-**rw-r--r-- ... /etc/passwd

## ディレクトリ
ディレクトリは、最も一般的な特殊ファイルである。ディレクトリファイルのレイアウトは、使用するファイルシステムによって定義される。UNIXではネイティブと非ネイティブの両方のファイルシステムが利用できるため、ディレクトリファイルレイアウトは1つではない。

ディレクトリは、モード文字列の1文字目に`'''d'''`が表示される。

 $ ls -dl /
 **d**rwxr-xr-x 26 root root 4096 Sep 22 09:29 /
 
 $ stat /
   File: "/"
   Size: 4096            Blocks: 8          IO Block: 4096   **directory**
 Device: 802h/2050d      Inode: 128         Links: 26
 Access: (0755/**d**rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
 ...

## シンボリックリンク
シンボリックリンクは他のファイルへの参照を示す特殊ファイルである。シンボリックリンクは、参照先ファイルのパスのテキスト表現として保存される。パスは相対パスであっても良く、また、参照先のファイルが必ずしも存在するとは限らない。

シンボリックリンクは、モード文字列の1文字目に`'''l'''`（小文字のエル）が表示される。

 **l**rwxrwxrwx ... termcap - /usr/share/misc/termcap
 **l**rwxrwxrwx ... S03xinetd - ../init.d/xinetd

## 名前付きパイプ(FIFO)
UNIXの強みの1つにプロセス間通信があり、その機能の1つにパイプがある。これは、あるプロセスの出力を別のプロセスの入力とする機能である。同じユーザによって開始された同じ親プロセス空間に両方のプロセスが存在する場合は問題ないが、プロセスが異なるユーザ名と権限で実行されている場合などには名前付きパイプ（FIFOともいう）を使用する必要がある。

名前付きパイプは、ファイルシステムのどこにでも存在することができる特殊ファイルである。`mkfifo`コマンドを使用して、`mkfifo mypipe`のようにすることで作成することができる。

名前付きパイプはは、モード文字列の1文字目に`'''p'''`が表示される。

 **p**rw-rw---- ... mypipe

## ソケット
ソケット（UNIXドメインソケット）は、プロセス間通信に使用される特別ファイルであり、2つのプロセス間の通信を可能にする。プロセスはUNIXドメインソケットを介して、データの送信だけでなく、`sendmsg()` and `recvmsg()`システムコールを使用してファイル記述子も送信することができる。

一方向のデータフローのみしか使用できない名前付きパイプとは異なり、ソケットは完全に双方向通信である。

名前付きパイプは、モード文字列の1文字目に`'''s'''`が表示される。

 **s**rwxrwxrwx /tmp/.X11-unix/X0

## デバイスファイル

UNIXでは、ほとんど全ての物が「ファイル」として処理され、ファイルシステム内のいずれかの場所に格納されている。ハードディスクドライブなどのハードウェアデバイスも同様である。例外はネットワークデバイスであり、これはファイルシステムに表示されず、個別に処理される。

デバイスファイルは、デバイスにアクセス権を適用し、ファイルに対する操作を適切なデバイスドライバに指示するために使用される。

UNIXは、キャラクタデバイスとブロックデバイスを区別する。その区別はおおよそ次の通りである。

*キャラクタデバイスは、入力のシリアルストリームのみを提供するか、出力のシリアルストリームを受け入れる。
*ブロックデバイスは、ランダムにアクセスが可能である。

例えば、ディスクパーティションには、パーティション上のブロックへのバッファなしランダムアクセスを提供するキャラクタデバイスと、パーティション上のブロックへのバッファ付きランダムアクセスを提供するブロックデバイスの両方がある。

キャラクタデバイスは、モード文字列の1文字目に`'''c'''`が表示される。ブロックデバイスは、モード文字列の1文字目に`'''b'''`が表示される。

 **c**rw------- ... /dev/null
 **b**rw-rw---- ... /dev/sda

## Doors

Doorsは、クライアントとサーバ間のプロセス間通信用の特別ファイルであり、現在Solarisでのみ実装されている。

Doorsは、モード文字列の1文字目に`'''D'''`が表示される。

 **D**r--r--r-- ... name_service_door

## 脚注

## 関連項目
* file (UNIX)