1

这是我第一次在这里发帖,所以请原谅任何格式问题。

我有一个交互式程序,它产生外部进程并监视它们的 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,..) !呃。很烦人。

任何帮助都深表感谢。

干杯!

4

1 回答 1

1

我想我解决了你的问题,对我来说,对 Serial 或 Parallel 的调用被阻止,我认为这是 std::cin.eof() 测试,

  std::getline(std::cin,choice);
  if(std::cin.eof()){         
     td::cout << "STDIN has been closed." << std::endl;
     exit(1);
   }

但是,将其更改为 std::cin.get(),对并行运行和串行运行都非常有效。

   if(std::cin.get()) {
     std::cout << "STDIN has been closed." << std::endl;
     exit(1);
   }

在我的系统上工作。

于 2013-04-09T20:44:51.033 回答