Проблема не в select
, а в логике вашего кода (неудивительно).
Если select
возвращается, потому что stdin доступен для чтения, вы все равно смотрите на c[0]
(из последнего чтения с сервера) - и даже если вы не читали с сервера на этот раз, это все равно \n
, потому что Вы никогда не сбрасываете его.
Переместить этот бит кода:
if (c[0] == '\n' || c[0] == '\0') {
buf[--buflen] = '\0';
handleMessage(buf, buflen); /* Just print message */
buf_do_clean = 1;
}
внутри блока else if (rc == 1) {
.