Я использую popen2 Open3 для взаимодействия с iostreams простой программы на C ++. Насколько я понимаю, что std :: cin и std :: cout независимы, но порядок, в котором у меня есть вызовы чтения / записи объектов ввода-вывода моего блока popen2, кажется, имеет значение. Моя программа на 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 будет зависать. Мое намерение состоит в том, чтобы условно записать \ n в stdin, если программа 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
}