0

select()呼び出しを使用して、プログラムのメインサイクルで入力の存在を検出しています。これにより、stdinの代わりにrawファイル記述子(0)を使用するようになります。

このモードで作業しているときに、ソフトウェアが最初に入力のチャンクを失うことがあることに気づきました。stdinは、プログラムの開始時にその一部を消費しているのではないかと思います。stdinのこの動作を防ぐ方法、または入力データ全体を取得する方法はありますか?

説明されている効果は、プログラム開始の瞬間に標準入力の一部のデータでのみ再現できます。私の実行可能ファイルは、開始時に常に何らかの入力があるように、xinetdサービスとして使用する必要があります。

標準入力は次のように読み取られます。

Error processInput() {
  struct timeval ktimeout;
  int fd=fileno(stdin);
  int maxFd=fd+1;
  FD_ZERO(&fdset);
  FD_SET(fd, &fdset);
  ktimeout.tv_sec = 0;
  ktimeout.tv_usec = 1;
  int selectRv=-1;
  while ((selectRv=select(maxFd, &fdset, NULL, NULL, &ktimeout)) > 0) {
    int left=MAX_BUFFER_SIZE-position-1;
    assert(left>0);
    int bytesCount=read(fd, buffer+position, left);
    //Input processing goes here
  }
}
4

1 に答える 1

1

調理済みの肉と生の肉を混ぜないでください。read()呼び出しを同等のfread()呼び出しに置き換えてみてください。

fileno(stdin)stdinオブジェクトを初期化している可能性が非常に高く、一部の入力を読み取ってバッファリングします。または、初期化を引き起こす何か(scanf()、getchar()など)をすでに呼び出している可能性があります。

于 2010-09-07T16:04:10.283 に答える