Примечание. Меня интересуют обычные файлы на диске.Не сокеты или тому подобное.
select не «работает» с обычными файлами, только с сокетами / pipe / ttys и, возможно, другими, но не с обычными файлами.Для обычных файлов select всегда будет сигнализировать дескриптор файла как читаемый / доступный для записи - таким образом, использовать select с файлами довольно бесполезно.
Обратите внимание, что это относится и к другим средствам мультиплексирования io, таким как poll /Epoll. AIO будет выполнять асинхронный ввод-вывод для обычных файлов, но поддержка операционной системы может отличаться, и это довольно сложный API-интерфейс для использования
Что касается того, сколько данных вы можете записать, обещаний нет,4096 - это не магическое число, которое выбирает, предполагает, что вы можете писать без блокировки, когда применяется к файловым дескрипторам, где использование select имеет смысл (сокеты / каналы / и т. Д.).Поскольку вы не можете знать, сколько данных вы можете записать без блокировки, вы должны всегда устанавливать дескриптор файла на неблокируемый, записывать, сколько фактически было записано, как указано возвращаемым значением write / send, и начинать запись с этой точки.в следующий раз выберите означает, что вы можете записать данные снова.