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