これは私の初めての投稿ですので、書式設定の問題をお許しください。
外部プロセスを生成し、それらの 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,..) でブロックされません!うーん。とても迷惑。
どんな助けでも大歓迎です。
乾杯!