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