Python でプログラム間通信の勉強をしていた.
その中で fork を使ってプロセスの複製を作って使っている.
このとき子プロセスを終了させるために親プロセスから sys.kill(pid, 8) を使って子プロセスを強制的に終了していたが,子プロセスを自発的に終了させたい.

そこで,親プロセスから子プロセスにメッセージを送って,子プロセスはそのメッセージを受け取れば終了する,というようにしたい.

このプロセス間通信を行うために pipe を使う.

import sys
import os

END_SIGNAL = ".\n"
rpipe, wpipe = os.pipe()
pid = os.fork()

if pid == 0:
# Child process
os.close(wpipe)
rpipe = os.fdopen(rpipe, 'r')

#print dir(rpipe)
i = 0
while i < 20:
msg_from_parent = rpipe.readline()

if msg_from_parent == END_SIGNAL:
print "End signal from parent"
sys.exit()
else:
print "Message from parent: ", msg_from_parent

i+=1

else:
# Parent process
os.close(rpipe)
wpipe = os.fdopen(wpipe, 'w')

message = "Hello child\n"
print ">",message
wpipe.write(message)

message = "Where are you?\n"
print ">",message
wpipe.write(message)

message = END_SIGNAL
print ">",message
wpipe.write(message)

message = "Hello child\n"
print ">",message
wpipe.write(message)

sys.exit()



実行結果は以下のようになる.

7:23.amarone[86]python pipe_test.py 
> Hello child

> Where are you?

> .

> Hello child

Message from parent: Hello child

Message from parent: Where are you?

End signal from parent



os.pipe() で送信(書き込み)用,受信(読み込み)用のファイル記述子 rpipe, wpipe を作る.
実際に書き込み,読み込みを行うには,これらを元に os.fdopen が作るファイルオブジェクトを作り使う必要がある.

rpipe には readline():改行までの一文を読み込む.の他に read():メッセージを読み続ける,や readlines():複数行を一括してリストとして読み込む.がある.




やじるし プログラム間通信関連メモの目次