Как запретить потоку stdin читать данные из файлового дескриптора при запуске программы? - PullRequest
0 голосов
/ 07 сентября 2010

Я использую вызов 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
  }
}

1 Ответ

1 голос
/ 07 сентября 2010

Не смешивайте приготовленное и сырое мясо вместе.Попробуйте заменить вызов read () эквивалентным вызовом fread ().

Весьма вероятно, что fileno(stdin) инициализирует объект stdin, вызывая его чтение и буферизацию некоторого ввода.Или, возможно, вы уже вызываете что-то, что вызывает его инициализацию (scanf (), getchar () и т. Д.).

...