named pipe(FIFO)覚書

最もシンプルなプロセス間通信(IPC)の一つである FIFO(named pipe) についてメモ。

unnamed pipe

$ ls | wc -l

と実行すると、ls と wc という2つのプロセスが起動され、ls は実行結果をパイプで wc に出力し、wc はパイプで ls の実行結果を入力する。
named pipe
named pipe(fifo/first in, first out)を使うと、任意のプロセスは(r/w権限がある限り) 指定したパイプに出力し、指定したパイプから入力することができる。上のコマンドを named pipe を使うと、以下のようになる。

$ mkfifo named_pipe
$ ls > named_pipe
$ wc -l < named_pipe

上のコマンドを実際に実行するとわかるように、 FIFO はデフォルトでは read と write が揃うまでブロックする。

named pipe を ls の long listing format で出力すると、エントリタイプは「p」で表され、ファイル名の末尾に「|」がくっついている。

$ ls -l /tmp/named_pipe
prw-rw-r-- 1 jsmith jsmith 0 Sep 17 18:32 /tmp/named_pipe|

コマンドラインからの named pipe の利用例は Linux Journal の次の記事を参照。

Introduction to Named Pipes By Andy Vaught
Linux Journal, September 1997 Issue #41

named pipe は単なるバイトストリームなので、通常のファイルと同じようにファイル操作できる。
FIFO 経由で SQL を流し、受け取った SQL を実行する例。参考URL

$ mkfifo /tmp/fifo_sql
$ echo 'select count(*) from person;' > /tmp/fifo_sql
$ psql test -f /tmp/fifo_sql
 (1 row)

named pipe のプログラミング例

named pipe を使った half-duplex/full-duplex のプログラムは 以下を参照

SUN Developer Networks : Introduction to Interprocess Communication Using Named Pipes
By Faisal Faruqui, July 2002

named pipe が1つあれば双方向通信できるけれども、この full-duplex の例では、通信の向きを変えた 2つの half-duplex な named pipe を作って双方向通信している。

上述の SUN(Oracle)の記事から FIFO のメリット・デメリットを引用。

Benefits of Names Pipes

  • Named pipes are very simple to use.
  • mkfifo is a thread-safe function.
  • No synchronization mechanism is needed when using named pipes.
  • Write (using write function call) to a named pipe is guaranteed to be atomic. It is atomic even if the named pipe is opened in non-blocking mode.
  • Named pipes have permissions (read and write) associated with them, unlike anonymous pipes. These permissions can be used to enforce secure communication.

Limitations of Names Pipes

  • Named pipes can only be used for communication among processes on the same host machine.
  • Named pipes can be created only in the local file system of the host, that is, you cannot create a named pipe on the NFS file system.
  • Due to their basic blocking nature of pipes, careful programming is required for the client and server, in order to avoid deadlocks.
  • Named pipe data is a byte stream, and no record identification exists.

Michael Kerrisk :The Linux Programming Interface での FIFO の扱い

“The Linux Programming Interface” では CH.44 : PIPES And FIFO(約30ページ) で pipe, named pipe, non-blocking I/O が扱われている。FIFO を使ってシーケンスを払い出すサーバ-クライアントプログラムを作成。

FIFO はバイトストリームのため、データをやり取りする際に、切れ目を判断する必要がある。方法としては

  1. 区切り文字を用意
  2. ヘッダー・ボディーに分けて、ヘッダーにボディー部分のサイズを出力(memchached プロトコルなど)
  3. 固定長


Tagged with: , , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: