ここに、java.lang.Process API を介して C++ アプリを起動し、stdin パイプを介してコマンドを送信しようとする Java アプリがあります。
process.getOutputStream().write("foo\n"); process.getOutputStream().flush();
C++ 側では、stdin の入力をチェックするループが実行されており、入力がある場合はそれを読み取ります。残念ながら、チェックは常に 0 を返すため、読み取ろうとしません。チェックを外すと、突然コマンドを認識して処理し始めます。これはLinux上にあります。
チェックして stdin から読み取る C++ アプリのコードは次のとおりです。
fd_set fds; FD_ZERO ( &fds ); FD_SET (0, &fds); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; if( select ( 1, &fds, 0, 0, &tv ) > 0 ) { char buf[16384]; buf[16383] = '\0'; if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 ) 戻る; }
先ほど言ったように、if 句を削除すると機能しますが、もちろんそれはあまり良くありません。それを巡るループは他のことも行うからです。誰かが私がここで間違っていることを理解していますか?
更新: 一方、2 つの非常に小さなサンプル アプリで問題を再現することができました。この問題は、ここで Qt フレームワークに関連しているようです。フレームワークに必要な QCoreApplication インスタンスを作成するとすぐに、stdin の select() が機能しなくなったようです。