Вы можете использовать fcntl()
, чтобы установить ваш сокет / трубу неблокирующим.Все вызовы read()
будут считывать доступные данные, а вызовы write()
будут записывать как можно больше данных без блокировки.В обоих случаях количество прочитанных / записанных данных находится в возвращаемом значении.
Пример без проверки ошибок:
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Затем после select()
и для всех уведомленных дескрипторов вызовитечто-то вроде:
if (buffer_sent < buffer_size)
buffer_sent += write(socket, buffer+buffer_sent, buffer_size - buffer_sent);
Просто для повторения, прежде чем я буду разгорячен: полное решение будет включать проверку ошибок.
Поиск в поиске «неблокирующего ввода-вывода» приведет к более полномупроработанные примеры:)