mkfifoコマンドは、FIFOという特別なファイルを作成するコマンドです。FIFOは、名前付きパイプとも呼ばれ、プロセス間通信(IPC,interprocess communication)の一つです。
また、Linuxコマンドでよく使われるパイプは、名前のないパイプであり、FIFOは名前のないパイプのように利用することができます。
目次
FIFOとは
FIFO(First In First out)とは、名前付きパイプと呼ばれます。
echo "hello" | catのように「|」の記号を用いて、パイプを使うと別のプロセスとデータのやり取りを行うことができます。しかし、この名前なしのプロセス間通信では、関係しているプロセスでしかデータのやり取りを行うことができません。
FIFOを用いるとecho "hello" > fifofileのようにFIFOに渡し、cat fifofileのように読み込むことで、関係しないプロセスでデータのやり取りを行うことができます。
FIFOは書き込み側のプロセスが複数存在する場合などに利用できます。
mkfifoの構文
mkfifoの構文
1 |
mkfifo [option]... filename |
mkfifoの利用例
FIFOを作成
(オプションなし)
mkfifoコマンドは、FIFO(名前付きパイプ)を作成することができます。
作成したFIFOをlsコマンドの-lオプションで確認を行うとファイルタイプがpと表示されます。
また、lsコマンドの-Fオプションで確認を行うとファイル名の末尾に|が表示されます。
コマンド例
1 |
mkfifo testfifo |
ls -lで確認
1 |
prw-rw-r-- 1 ubuntu ubuntu 0 8月 24 11:55 testfifo |
ls -Fで確認
1 |
testfifo| |
作成するFIFOのパーミッションを設定
(-mオプション)
-mオプションを用いると作成するFIFOのパーミッションを設定することができます。
設定方法はchmodコマンドと同じように設定することができます。
コマンド例
1 |
mkfifo -m600 chmodefifo |
ls -lで確認
1 |
prw------- 1 ubuntu ubuntu 0 8月 24 12:04 chmodefifo |
FIFOを利用
FIFOへ書き込みと読み込み
mkfifoコマンドで作成されたFIFOへの書き込みや読み込みは書き込み側と読み込み側が両方開かれるまで応答を待つブロック(block)が発生します。
コマンド例の書き込み側と読み込み側は、別の端末を開いて実行しています。
別の端末を開く方法として、GUIでは単純に新しい端末を開いて実行できます。
CUIでは、tmuxをインストールして端末を分割したり、alt+F1~6(GUIではctrl+alt+F1~6)でそれぞれ別の端末に切り替えることができます。
コマンド例(読み込み)
1 |
cat testfifo |
応答待ち
コマンド例(書き込み)
1 |
echo hello > testfifo |
実行結果(読み込み)
1 |
hello |
応答待ち終了
teeコマンドを用いて出力を2つに分割
FIFOとteeコマンドを用いることで、パイプする内容を2つに分割することができます。
ただし、コマンド例の最初の一行目は、teeコマンドが実行される時に応答待ちの状態になるので、バックグラウンド実行にしています。
コマンド例
1 2 |
echo hello | tee testfifo | cat & cat testfifo |
実行結果
1 2 |
hello hello |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版
外部リンクNamed Pipes (FIFOs - First In First Out)