И это всё МОЁ

На вход программе (через Unix Domain Socket или через stdin) приходит сообщение произвольной длины, после чего отправитель ожидает ответа.


Так как сообщение произвольной длины, не получается использовать read(length) или recv(length) — если длина сообщения окажется кратной length, то случится взаимоблокировка (клиент ждёт ответа, сервер ждёт продолжения сообщения).


Решением было бы посмотреть, есть ли в буфере байты.


man ioctl предлагает такое решение:


if ((ioctl(sock, I_NREAD, &num) && num > 0)
/* дописать даные из ввода в буфер */


, но это не работает для stdin (ошибка ENOTTY).


Есть ли общий способ? Или для сокета и для stdin обязательно надо применять разные подходы (если так, то как проверить)?









 , , ,