UNIXファイルタイプ

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

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

モード文字列編集

ls -lコマンドの実行例を以下に示す。

drwxr-xr-x 2 root root     0 Jan  1  1970 home

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

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

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

実装の例編集

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

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

一般ファイル編集

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

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

ディレクトリ編集

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

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

$ ls -dl /
drwxr-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/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
...

シンボリックリンク編集

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

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

lrwxrwxrwx ... termcap -> /usr/share/misc/termcap
lrwxrwxrwx ... S03xinetd -> ../init.d/xinetd

名前付きパイプ(FIFO)編集

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

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

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

prw-rw---- ... mypipe

ソケット編集

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

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

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

srwxrwxrwx /tmp/.X11-unix/X0

デバイスファイル編集

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

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

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

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

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

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

crw------- ... /dev/null
brw-rw---- ... /dev/sda

Doors編集

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

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

Dr--r--r-- ... name_service_door

関連項目編集

脚注編集

  1. ^ a b <sys/stat.h>”. The Open Group Base Specifications Issue 6. The Open Group (2019年7月21日). 2019年8月27日閲覧。
  2. ^ IEEE Std 1003.1-2008 ls”. The Open Group (2017年3月11日). 2019年8月27日閲覧。
  3. ^ filemode function in GNU coreutils”. GNU (2017年3月11日). 2019年8月27日閲覧。
  4. ^ printtype function from FreeBSD”. FreeBSD (2017年3月11日). 2019年8月27日閲覧。