Как предотвратить поток Stdin с чтением данных из связанного дескриптора файла на запуске программы?
-
01-10-2019 - |
Вопрос
Я использую SELECT () Вызов, чтобы обнаружить присутствие ввода в основном цикле моей программы. Это заставляет меня использовать необработанный файл дескриптор (0) вместо stdin.
Работая в этом режиме, я заметил, что мое программное обеспечение иногда теряет кусок ввода в начале. Я подозреваю, что 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
}
}
Решение
Не смешивайте приготовленное и сырое мясо вместе. Попробуйте заменить вызов чтения () с эквивалентным вызовом FREAD ().
Очень вероятно, что fileno(stdin)
Инициализирует объект stdin, заставляя его читать и буфер некоторый вход. Или, возможно, вы уже называете то, что заставляет его инициализировать (SCANF (), getchar () и т. Д.).