パイプファイルで他のプログラムとデータのやりとりをする
組込の仕事をしてまして、
CのプログラムとRubyのプログラムでやりとりをする
必要が出て来ました。
実験してみましょう
mkfifo /tmp/fifotest
で/tmp/fifotestというパイプを作っておきます。
Rubyにはこれを扱うライブラリは標準ではないようです。
ruby -e 'f=open("/tmp/fifotest");while line=f.gets;puts line;end'
を実行しておきます。
別ターミナルを開き、
% irb irb(main):001:0> fw=open("/tmp/fifotest","w+") => #<File:/tmp/fifotest> irb(main):002:0> fw.puts "hello" => nil irb(main):003:0> fw.flush => #<File:/tmp/fifotest>
とかって打つと、さっきのターミナルに
% ruby -e 'f=open("/tmp/fifotest");while line=f.gets;puts line;end' hello
とかって出てきます。1行ずつずっと待っていますので、
どんどん入れられます。
irb(main):013:0> fw.puts "hoge" => nil irb(main):014:0> fw.flush => #<File:/tmp/fifotest>
% ruby -e 'f=open("/tmp/fifotest");while line=f.gets;puts line;end' hello hoge
Rubyだとout,in=IO.pipeとかでパイプをつくったり、
cmd=open("|/usr/bin/cmd")
とか、open3を使ったりして別プロセスとやりとりするんですが、
パイプだとこのようにやりとりします。
mkfifoとか、今回はじめて知りました。