Это мой первый пост здесь, поэтому, пожалуйста, извините за проблемы с форматированием.
У меня есть интерактивная программа, которая порождает внешние процессы и отслеживает их ввод-вывод. Все работает нормально, пока я не создам что-то с помощью «mpiexec», после чего STDIN, похоже, сломается.
Я понимаю, что это будет трудно воспроизвести для большинства людей, но если кто-то увидит что-то очевидное или знает об этой проблеме... пожалуйста, помогите!
Вот фрагмент:
int main( ... )
{
std::string choice;
while(std::getline(std::cin,choice)){
if(!choice.empty()){
if(choice == "Parallel"){
system("mpiexec ./aprogram");
}
if(choice == "Serial"){
system("./aprogram");
}
// Now the external process is done... so far, so good
std::cout << "Program is done. Press ENTER to continue."
<< std::endl;
// This next line *works* if the external process was serial
// But *fails* when "mpiexec" was invoked
std::getline(std::cin,choice);
if(std::cin.eof()){
std::cout << "STDIN has been closed." << std::endl;
exit(1);
}
}
}
}
Я пробовал много разных вещей, например. каналы, явное разветвление, тщательное управление дескрипторами. Самое странное, что если я отключу и сохраню stdin, а затем восстановлю его после возврата «mpiexec», то я больше не получаю EOF на std::cin, а вместо этого std::getline(std::cin,... ) больше не блокирует! Программа переходит в бесконечный цикл, считывая нулевые байты из std::cin в вызове std::readline.
Если во время работы внешнего процесса под управлением mpiexec я засуну кучу данных в std::cin (например, набрав), то последующие вызовы std::readline правильно разберут строки данных, которые я туда засунул, но снова... как только он закончит чтение этих данных, он просто продолжит работу в бесконечном цикле (т.е. не блокируется на std::readline(std::cin,..), даже если нет данных для чтения! Тьфу. Так раздражает.
Любая помощь приветствуется.
Ваше здоровье!
read
для fd0
возвращаетEAGAIN
, как если бы стандартный ввод был сделан неблокирующим. Я еще не нашел, где бы мы это делали, но здесь определенно происходит что-то смешное. Мы продолжим смотреть на это. - person Dave Goodell   schedule 11.01.2013