Я вижу, что вопрос уже отредактирован и, по крайней мере, более понятен, чем раньше.
В любом случае, разве это не противоречие?
- Вы делаете неблокируемый ввод / вывод, потому что хотите быстро читать небольшие объемы, обычно жертвуя пропускной способностью для задержки.
- Вы делаете его буферизованным, потому что вас не очень заботит задержка, но вы хотите эффективно использовать подсистему ввода-вывода, торгуя задержкой для пропускной способности.
Выполнение их обоих одновременно кажется противоречием, и его трудно представить.
Какая семантика вам нужна? Если вы сделаете это:
int fd;
char buf[1024];
ssize_t got;
fd = setup_non_blocking_io(...);
got = read(fd, buf, sizeof buf);
Какое поведение вы ожидаете, если доступно 3 байта? Блокирующий / буферизованный ввод-вывод может блокироваться до тех пор, пока не сможет считывать больше, чтобы удовлетворить ваш запрос, неблокирующий ввод-вывод немедленно вернет 3 доступных байта.
Конечно, если у вас есть какой-то протокол сверху, который определяет какую-то структуру сообщения, так что вы можете знать, что «этот ввод-вывод неполон, я не могу разобрать его, пока у меня нет больше данных», вы можете самостоятельно буферизуйте на этом уровне и не передавайте данные вверх, пока не будет получено полное сообщение.