names=popen
visibility=public
kind=defined

--- popen(command, mode = "r", opt={})                -> IO
--- popen(command, mode = "r", opt={}) {|io| ... }    -> object

command をサブプロセスとして実行し、そのプロセスの標準入出力
との間にパイプラインを確立します。生成したパイプを [[c:IO]] オブジェクトとして返します。

command が文字列の場合は、シェルを経由して子プロセスを実行します。
command が配列の場合は、シェルを経由せずに子プロセスを実行します。

  p io = IO.popen("cat", "r+")  # => #<IO:0x401b75c8>
  io.puts "foo"
  io.close_write
  p io.gets                     # => "foo\n"

ブロックが与えられた場合は生成した IO オブジェクトを引数にブ
ロックを実行し、その結果を返します。ブロックの実行後、生成したパイ
プは自動的にクローズされます。

  p IO.popen("cat", "r+") {|io|
    io.puts "foo"
    io.close_write
    io.gets
  }
  # => "foo\n"

@param command コマンド名を文字列か配列で指定します。配列が指定された場合には、
               シェルを経由せずに子プロセスを実行します。

@param mode オープンする IO ポートのモードを指定します。mode の詳細は [[m:Kernel.#open]] 参照して下さい。
@param opt エンコーディングなどを設定するオプション引数(see [[m:IO.new]])

@raise Errno::EXXX パイプ、あるいは子プロセスの生成に失敗した場合に発生します。

--- popen("-", mode = "r", opt={})                -> IO
--- popen("-", mode = "r", opt={}) {|io| ... }    -> object

第一引数に文字列 "-" が指定された時、[[man:fork(2)]] を
行い子プロセスの標準入出力との間にパイプラインを確立します。
親プロセスでは IO オブジェクトを返し、子プロセスでは
nil を返します。

  io = IO.popen("-", "r+")
  if io  # parent
    io.puts "foo"
    p io.gets                   # => "child output: foo\n"
    io.close
  else   # child
    s = gets
    print "child output: " + s
    exit
  end
  
ブロックを与えられた場合、親プロセスでは生成した IO オブジェクトを引数に
ブロックを実行し、その結果を返します。ブロックの実行後、生成したパイ
プは自動的にクローズされます。
子プロセスでは nil を引数にブロックを実行し終了します。  

  p IO.popen("-", "r+") {|io|
    if io   # parent
      io.puts "foo"
      io.gets
    else    # child
      s = gets
      puts "child output: " + s
    end
  }
  # => "child output: foo\n"

@param mode オープンする IO ポートのモードを指定します。mode の詳細は [[m:Kernel.#open]] 参照して下さい。
@param opt エンコーディングなどを設定するオプション引数(see [[m:IO.new]])

@raise Errno::EXXX パイプ、あるいは子プロセスの生成に失敗した場合に発生します。

