Я использую вызов select () для обнаружения присутствия ввода в основном цикле моей программы.Это заставляет меня использовать необработанный файловый дескриптор (0) вместо стандартного ввода.
Во время работы в этом режиме я заметил, что мое программное обеспечение иногда теряет часть ввода в начале.Я подозреваю, что 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
}
}