Я использую Open3 popen2 для взаимодействия с iostreams простой программы C++. Насколько я понимаю, std::cin и std::cout независимы, но порядок, в котором у меня есть вызовы чтения/записи объектов ввода-вывода моего блока popen2, кажется, имеет значение. Моя программа на С++:
int main(int argc, char** argv) {
std::string input;
std::cout<<"EXECUTE TASK"<<std::endl;
std::cin>>input;
std::cout<<"END"<<std::endl;
}
Мой рубиновый скрипт:
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 в стандартный вывод, если программа C++ сначала записывает expected_string
в стандартный вывод, но я вынужден закрыть поток стандартного ввода, прежде чем смогу выполнить строки чтения. Как я уже сказал, я понимаю, что два потока независимы, и файловые дескрипторы, возвращаемые 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
}