名前付きパイプ(named pipe, FIFO)の基本的な使い方

名前付きパイプ(FIFO)は、LinuxやUnix系システムで使用される特別なファイルで、プロセス間でデータをやり取りするための通信手段です。通常のパイプと異なり、名前付きパイプにはファイルシステム上の名前が付けられており、異なるプロセスがこの名前を通じてデータの送受信を行うことができます。

名前付きパイプ(FIFO)の使用例をいくつか紹介します。これらの例は、名前付きパイプがプロセス間通信(IPC)やデータ転送にどのように役立つかを示しています。

1. 簡単なデータ転送

UNIX系システムでの例

まず、名前付きパイプを作成します。

1mkfifo mypipe

次に、別々のターミナルで以下のコマンドを実行します。

  • ターミナル1: データを書き込むプロセス
1echo 'Hello, world!' > mypipe
  • ターミナル2: データを読み取るプロセス
1cat mypipe

説明: ターミナル1で echo コマンドが mypipe にデータを書き込むと、ターミナル2で cat コマンドがそのデータを読み取ります。これにより、異なるプロセス間でデータを簡単に転送できます。

2. デーモンとクライアントの通信

サーバー(デーモン)プロセスとクライアントプロセス間の通信

  • サーバー(デーモン)プロセス
1# server.sh
2mkfifo mypipe
3
4while true; do
5    if read line < mypipe; then
6        echo "Received: $line"
7        echo "Response from server" > mypipe
8    fi
9done
  • クライアントプロセス
1# client.sh
2echo "Request from client" > mypipe
3cat mypipe

説明: サーバースクリプト server.sh は、名前付きパイプ mypipe を介してクライアントからの要求を待ち受けます。クライアントスクリプト client.sh は、要求をサーバーに送り、サーバーからのレスポンスを表示します。

3. ログの集約

アプリケーションログをリアルタイムで別のプロセスに転送

  • ログ生成プロセス
1# logger.sh
2mkfifo logpipe
3
4while true; do
5    echo "$(date) - Log entry" > logpipe
6    sleep 1
7done
  • ログ処理プロセス
1# logprocessor.sh
2cat logpipe | while read line; do
3    echo "Processing: $line" >> processed_logs.txt
4done

説明: logger.sh は、名前付きパイプ logpipe を介してログエントリを生成します。logprocessor.sh は、そのパイプからログエントリを読み取り、processed_logs.txt に書き込みます。この方法で、ログデータをリアルタイムで集約できます。

4. プロセス間のデータストリーム

データを生成し、別のプロセスで処理する

  • データ生成プロセス
1# data_producer.sh
2mkfifo data_pipe
3
4while true; do
5    echo "Data $(date)" > data_pipe
6    sleep 2
7done
  • データ処理プロセス
1# data_consumer.sh
2cat data_pipe | while read data; do
3    echo "Received data: $data"
4done

説明: data_producer.sh は、名前付きパイプ data_pipe を介して定期的にデータを生成します。data_consumer.sh はそのデータを読み取り、処理します。この方法で、データのストリーミング処理が可能です。

5. システム間通信

ネットワーク経由でのデータ転送(UNIXソケットを使用した例)

名前付きパイプを使って、ネットワーク越しにデータを転送する場合、通常はネットワークソケットを使用しますが、ローカルシステム内のプロセス間通信として名前付きパイプを使用できます。

これらの例は、名前付きパイプがどのようにプロセス間でのデータ交換や通信に利用できるかを示しています。名前付きパイプは、一時的なデータストリームの転送から、より複雑なデータ処理、ログの集約、サーバーとクライアント間の通信に至るまで、幅広い用途に適しています。

関連ページ