Ruby でプロセス間通信
#! /usr/bin/ruby # 2対のパイプを用意 pin, cout = IO.pipe cin, pout = IO.pipe Process.fork { # この中は子プロセス STDIN .reopen cin STDOUT.reopen cout pout.close_write pin.close_read exec "bc" # 子プロセスはこのあと bc になる } # この後は親プロセス cin.close_read cout.close_write STDIN.each { |line| # 標準入力から1行読み取り pout.puts line # それを親プロセス用書き込み口に書き puts "bc> " + pin.readline # 親プロセス用読み取り口から読んで表示 }
大体 C と同じ。
open3 というライブラリを使うともっと見やすい。
require "open3" cin, cout, cerr = *Open3.popen3('bc') # 子プロセスの入力、出力、エラーを返す # このスレッドで、標準入力から cin にデータを流し込む Thread.fork { STDIN.each { |line| cin.print line } cin.close_write } cout.each do |line| # 子プロセスの出力を表示する print line end