Jump to content
Калькуляторы

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, так что собака не здесь порылась.

Edited by NiTr0

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Edited by NiTr0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this