UNIXファイルタイプ
UNIXファイルタイプ(UNIX file types)とは、UNIXが識別するファイルの種別のことであり、POSIXに規定される標準のUNIXファイルタイプは、regular(一般)、directory(ディレクトリ)、symbolic link(シンボリックリンク)、FIFO special(名前付きパイプ)、block special(ブロックデバイスファイル)、character special(キャラクタデバイスファイル)、socket(ソケット)の7種類である[1]。OSの実装によっては、これよりも多くのファイルタイプが使用できる(SolarisのDoorsなど)。ファイルタイプは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_IFMT
のS_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
脚注
[編集]- ^ a b “<sys/stat.h>”. The Open Group Base Specifications Issue 6. The Open Group (21 July 2019). 2019年8月27日閲覧。
- ^ “IEEE Std 1003.1-2008 ls”. The Open Group (11 March 2017). 2019年8月27日閲覧。
- ^ “filemode function in GNU coreutils”. GNU (11 March 2017). 2019年8月27日閲覧。
- ^ “printtype function from FreeBSD”. FreeBSD (11 March 2017). 2019年8月27日閲覧。