这是我第一次在这里发帖,所以请原谅任何格式问题。
我有一个交互式程序,它产生外部进程并监视它们的 IO。一切正常,直到我用“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);
}
}
}
}
我尝试了很多不同的东西,例如管道、显式分叉、细致的描述符管理。最奇怪的是,如果我关闭并保存标准输入,然后在“mpiexec”返回后恢复它,那么我不再在 std::cin 上获得 EOF,而是 std::getline(std::cin,... ) 不再阻塞!程序进入一个无限循环,在 std::readline 调用中从 std::cin 读取零字节。
如果,当外部进程在 mpiexec 下运行时,我将一堆数据堆叠到 std::cin 中(例如通过键入),然后对 std::readline 的后续调用正确解析我卡在其中的数据行,但是再次......一旦完成读取该数据,它就会继续进入无限循环(即即使没有要读取的数据也不会阻塞 std::readline(std::cin,..) !呃。很烦人。
任何帮助都深表感谢。
干杯!