パイプファイルで他のプログラムとデータのやりとりをする

組込の仕事をしてまして、
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とか、今回はじめて知りました。