>> 古い記事: (solved) Javascriptのエラー: Security error" code: "1000
<< 新しい記事: (solved) curl: Warning: You can only select one HTTP request!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby(Linux): パイプとプロセスの fork/exec を使い外部コマンドと入出力をやりとりする

※検索で携帯用のページに辿りついてしまった方はこちらのPC用のページをどうぞ

Rubyで外部コマンドと入出力のやりとりを行いたい、という需要は そこそこあると思うのですが、パイプやプロセスについて知っていないと ちんぷんかんぷんなので、サンプルと図を作ってみました。

自分もよく分からない状態から始めたので 間違いなどあるかもしれません。

スレッドについては割愛。


ソースだけ見ていてもイメージしにくいので 適当に図を描いてあーでもないこーでもないとやってみると だんだん分かってきます。


外部コマンドの例として mplayer を使いました。 mplayer は -slave オプションを付けていると 標準入力からのコマンドを受け取って動作するので、それを利用して 「4秒再生、4秒一時停止」を繰り返させています。

# 入出力を両方使いたいのでパイプが 2本必要
# 入力のみまたは出力のみでよければ 1本だけ作る
pin_1, pout_1 = IO.pipe # 外部コマンドからの読み取り用
pin_2, pout_2 = IO.pipe # 外部コマンドへの書き込み用

Thread.new {
  fork {
    pin_1.close  # ★
    pout_2.close # ★
    STDIN.reopen( pin_2 )
    STDOUT.reopen( pout_1 )
    
    cmd = "mplayer -slave foo.mp3"
    exec cmd
  }
}

pin_2.close  # ★
pout_1.close # ★

# 外部コマンドに出力を送る
# → pout_2 に書く
Thread.new {
  loop {
    sleep 4
    pout_2.write "pause\n"
    sleep 4
    pout_2.write "pause\n"
  }
}

# 外部コマンドの出力を読む
# → pin_1 から読む
loop{
  line = pin_1.gets( "\r" ) # "\r" で区切って読む。これはmplayerの出力に合わせた措置。
  puts "read from ext cmd: #{line}"
}


ちなみに、パイプの使い方については青木さんの「ふつうのLinuxプログラミング」を参考にしました。 この本に載っている解説は Ruby ではなく C言語で書かれていますが仕組みは同じです。

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
ソフトバンククリエイティブ 2005-07-27
売り上げランキング : 18422

おすすめ平均 star
star初心者にはちょうど良い。でもストリームという造語には納得できない
star良書だと思います
starLinuxを学ぶ為の読本、Cプログラムミングを学ぶなら別の本で

Amazonで詳しく見る
by G-Tools

参考(外部リンク)

>> 古い記事: (solved) Javascriptのエラー: Security error" code: "1000
<< 新しい記事: (solved) curl: Warning: You can only select one HTTP request!
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。