Jump to content

Recommended Posts

Posted (edited)

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

 

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

Ожидание событий (поступление данных в буффер 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
Posted (edited)

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

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

Edited by NiTr0

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.