【发布时间】:2011-05-25 17:13:12
【问题描述】:
我正在使用 Open3 的 popen2 与一个简单的 C++ 程序的 iostream 进行交互。我的理解是 std::cin 和 std::cout 是独立的,但是我的 popen2 块的 IO 对象读/写调用的顺序似乎有所不同。我的 C++ 程序是:
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
}
以上工作正常,但如果我将stdout.readlines 移动到stdin.close 之前,ruby 脚本将挂起。我的意图是如果 C++ 程序首先将 expected_string 写入标准输出,则有条件地将 \n 写入标准输入,但我不得不在执行 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
}
【问题讨论】: