我使用Open3的popen2與簡單的C++程序的iostreams進行交互。我的理解是,std :: cin和std :: cout是獨立的,但我有我的popen2塊的IO對象讀/寫調用的順序似乎有所作爲。我的C++程序是:使用Ruby popen2與C++ iostreams交互時的排序問題
int main(int argc, char** argv) {
std::string input;
std::cout<<"EXECUTE TASK"<<std::endl;
std::cin>>input;
std::cout<<"END"<<std::endl;
}
我的Ruby腳本是:
require 'open3'
expected_string = "EXECUTE TASK"
Open3.popen2('~/Sandbox/a.out') { |stdin, stdout|
stdin.write('\n')
stdin.close
results = stdout.readlines
puts results
}
以上工作正常,但如果我的stdin.close
之前移動stdout.readlines
,紅寶石腳本將掛起。我的意圖是有條件地將\ n寫入標準輸入,如果C++程序首先將expected_string
寫入標準輸出,但是我必須先關閉stdin流才能執行readlines。就像我說的,我的理解是這兩個流是獨立的,並且由popen2返回的文件描述符似乎也是獨立的,那麼爲什麼順序很重要?
任何幫助表示讚賞。謝謝。
有什麼,我試圖完成全範圍解決方案(有人可能會有所幫助):
int main(int argc, char** argv) {
std::string input;
std::cout<<"1"<<std::endl;
std::cout<<"2"<<std::endl;
std::cout<<"3"<<std::endl;
std::cout<<"4"<<std::endl;
std::cout<<"5"<<std::endl;
std::cout<<"EXECUTE TASK"<<std::endl;
std::cout.flush();
std::cin>>input;
std::cout<<"END"<<std::endl;
}
require 'open3'
expected_string = "EXECUTE TASK"
Open3.popen2('~/Sandbox/a.out') { |stdin, stdout|
found = false
begin
while(result = stdout.readline)
puts result
if(result.include?(expected_string))
found = true
break
end
end
rescue
raise "Exception caught while reading lines"
end
stdin.write('\n')
stdin.close
}
工作。將在原始帖子中編輯解決方案。謝謝。 – wholevinski 2011-05-25 18:58:08