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