Перейти к содержимому
Калькуляторы

Linux, tty, select() Некорректное поведение при наличии данных в буффере

Немного не тематический вопрос знатокам.

 

Итак, имеется некий демон, который общается с ком-портом и отправляет/забирает данные; + к тому он общается по сети.

Ожидание событий (поступление данных в буффер tty либо соединение с сокетом) реализовано через select()

Итого имеем такой кусочек кода:

 

    if (FD_ISSET(tty.fd, &sdsetrd))
     logw(5, "conn_loop(): select(): tty.fd is present");
   rc = select(max_sd + 1, &sdsetrd, &sdsetwr, NULL, &t_out);
   ioctl(tty.fd, FIONREAD, &i);
   logw(5, "conn_loop(): select(): %d descriptors ready, there are %d bytes in buffer", rc, i);

И этот кусочек кода при наличии в буфере всего 1 байта выдает парадоксальный результат:

1312484897:018074 conn_loop(): select(): tty.fd is present
1312484897:109351 conn_loop(): select(): 0 descriptors ready, there are 1 bytes in buffer

Т.е. - select() считает буфер tty, содержащий 1 байт, пустым, и возвращает управление по тайм-ауту (~100 мсек).

При наличии в буффере 2 байт (или более) - все прекрасно работает.

Багу выловил на ядре 3.0, но в 2.6.35.13, если не ошибаюсь, она тоже присутствовала. От системных библиотек (glibc/uclibc) не зависит. GCC 4.4.5.

Собссно вопрос: это баг или я чего-то не понял из мануала? :)

 

P.S. max_sd - заведомо больше номера дескриптора tty, так что собака не здесь порылась.

Изменено пользователем NiTr0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может tty недонастроен, или не в том режиме, например VMIN=2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

например VMIN=2.

Таки да. Спасибо за подсказку. Сам уже не один час голову ломал, а туда заглянуть и не додумался...

Изменено пользователем NiTr0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.