ここに、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() が機能しなくなったようです。