На вход программе (через Unix Domain Socket или через stdin) приходит сообщение произвольной длины, после чего отправитель ожидает ответа.
Так как сообщение произвольной длины, не получается использовать read(length)
или recv(length)
— если длина сообщения окажется кратной length
, то случится взаимоблокировка (клиент ждёт ответа, сервер ждёт продолжения сообщения).
Решением было бы посмотреть, есть ли в буфере байты.
man ioctl
предлагает такое решение:
if ((ioctl(sock, I_NREAD, &num) && num > 0)
/* дописать даные из ввода в буфер */
, но это не работает для stdin
(ошибка ENOTTY
).
Есть ли общий способ? Или для сокета и для stdin обязательно надо применять разные подходы (если так, то как проверить)?