имеется некий демон, который общается с ком-портом и отправляет/забирает данные; + к тому он общается по сети. Ожидание событий (поступление данных в буффер 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 байт, пустым. При наличии в буффере 2 байт (или более) - все прекрасно работает.
Багу выловил на ядре 3.0, но в 2.6.35.13, если не ошибаюсь, она тоже присутствовала. От системных библиотек (glibc/uclibc) не зависит. GCC 4.4.5. Собссно вопрос: это баг или я чего-то не понял из мануала? :)
P.S. max_sd - заведомо больше номера дескриптора tty, так что собака не здесь порылась.