Linux,永続的な名前付きのパイプを作成しプロセス間で通信する

スポンサーリンク

鍛錬 169

Linux,永続的な名前付きのパイプを作成して、プロセス間で通信する

Linux で、名前付きの永続的なパイプを作成してプロセス間通信を行うには、mkfifo を使用します。
 
使用方法は、以下に示す通りです。

mkfifo ファイル名

 
挙動を確認

端末を 2 つ起動して、名前付きパイプを使用した通信を行いながら挙動を確認します。

端末名

  • 端末 A
  • 端末 B

 

  1. 名前付きのパイプを作成する。

以下は、端末 A にて、名前付きのパイプ test_pipe を作成しています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ mkfifo test_pipe
***@ubuntu:~/***/test/tmp$ ls -l
合計 0
prw-rw-r-- 1 *** *** 0 May 26 05:41 test_pipe

 

  1. 名前付きパイプに書き込みを行う。

以下は、端末 A にて、作成した名前付きパイプにデータの書き込みを行っています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ echo "Hello" > test_pipe
 

 
上記に示した通り、データの書き込みを行っても処理が戻ってきません。
これは、名前付きパイプの反対側、つまりもう一方のプロセスがデータの読み取りを行わない限り、書き込んだ側の処理が戻らないためです。
 

  1. もう一方のプロセスにて、名前付きパイプから読み取りを行う。

以下は、端末をもう一つ起動して(端末 B)、先程作成した名前付きパイプ test_pipe からデータの読み取りを行っています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ cat test_pipe
Hello
***@ubuntu:~/***/test/tmp$

 
上記に示した通り、端末 B にて名前付きパイプからデータの読み取りを行うと、端末 A にて書き込みを行った Hello を読み取ることができました。
また、処理が戻ってきていなかった端末 A では、端末 B が読み取りを行ったため、以下に示す通り処理が戻ってきました。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ echo "Hello" > test_pipe
***@ubuntu:~/***/test/tmp$

 

  1. 今度は、読み取りを先に実行して挙動を確認する。

以下は、端末 A にて、先程とは逆で名前付きパイプに対してデータの読み取りを先に実行しています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ cat test_pipe
 

 
上記に示した通り、名前付きパイプからデータの読み取りを行っても、書き込みが行われていないため処理が戻ってきません。
 

  1. もう一方のプロセスにて、名前付きパイプに書き込みを行う。

以下は、端末 B にて、名前付きパイプにデータの書き込みを行っています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ echo "Thank you" > test_pipe
***@ubuntu:~/***/test/tmp$

 
上記に示した通り、端末 B にて、名前付きパイプにデータの書き込みを行いました。
書き込み後に端末 A を確認すると、以下に示す通り、端末 B が名前付きパイプに書き込んだデータを読み取り、戻っきていなかった処理が戻っています。

***@ubuntu:~/***/test/tmp$ 
***@ubuntu:~/***/test/tmp$ cat test_pipe
Thank you
***@ubuntu:~/***/test/tmp$
タイトルとURLをコピーしました