1

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

4

5 に答える 5

1

2 つの if があります。どちらを削除すると機能しますか?

fgets()は復帰する前に改行、バッファフル、または EOF を待ちませんか? 改行を書いているのを見ません。「foo」はバッファを埋めません。また、ストリームが閉じられていないため、EOF が表示されますか?

于 2009-06-17T14:49:32.870 に答える
0

私は間違っているかもしれませんが、select呼び出しのタイムアウトを 0 にすることは理にかなっていますか? タイムアウト値を増やしてみます。

于 2009-06-17T14:40:34.010 に答える