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
}
}