標準入出力の取得方法について教えてください。
例えば下記のようなコードがあったとします。
C++
1// foo.cpp 2#include <iostream> 3using namespace std; 4 5int main(void) 6{ 7 int num; 8 9 cout << "input num:"; 10 cin >> num; 11 12 cout << "output num:" << num << endl; 13 14 return 0; 15}
これをコンパイルした後にしコマンドライン実行するために以下のようなスクリプトを作成しました。
Ruby
1# test.rb 2require 'oepn3' 3 4Open3.popen3("./a.out") do |i, o, e, w| 5 i.puts(10) 6 i.close 7 o.each do |line| p line end 8 e.each do |line| p line end 9end
この時出力できるログは次の用になります。
$ ruby test.rb input num:output num:10 $
このときに標準出力内に入力が含まれたログを取りたいと考えています。
どの様にすればよいでしょうか?
追記
otnさんの回答を基に次のようなスクリプトを作成しました。
Ruby
1require 'open3' 2 3data=10 4Open3.popen3("./a.out") do |i, o, e, w| 5 begin 6 # puts "ouput:" 7 print o.read_nonblock(100) 8 rescue IO::WaitReadable 9 # puts "IO::WaitReadable" 10 sleep(0.01) 11 retry 12 rescue 13 # puts "rescue:" 14 i.puts(data) 15 puts data 16 end 17 18 i.close 19 20 o.each do |line| puts line end 21 e.each do |line| puts line end 22end
これでおおよ上手く動作したのですが、1つ懸念事項があります。
質問内で使用したC++のプログラムを次のように改変した場合にIO::WaitReadableのエラーが吐かれ続けてしまい、無限ループになってしまうという問題です。
C++
1#include <iostream> 2using namespace std; 3 4int main(void) 5{ 6 int num; 7 8 // 初期出力をなくした場合 9 // cout << "input num:"; 10 cin >> num; 11 12 cout << "output num:" << num << endl; 13 14 return 0; 15}
何故このような自体になってしまうかがよく分かりません。
何方かお教えいただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/22 07:36
2016/12/22 07:44
2016/12/22 08:08