Как предотвратить поток Stdin с чтением данных из связанного дескриптора файла на запуске программы?

StackOverflow https://stackoverflow.com/questions/3658475

Вопрос

Я использую 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 () и т. Д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top