Вы неправильно понимаете, что означает неблокирование. Это не подразумевает асинхронную операцию - вы можете иметь любую комбинацию асинхронного / синхронного и блокирующего / неблокирующего.
A write()
просто передает данные ядру, чтобы позаботиться о них. Когда write()
успешно возвращается, ядро теперь позаботилось о данных - это верно независимо от того, является ли файловый дескриптор блокирующим или неблокирующим. Независимо от того, завершило ли ядро запись этого вопроса, это отдельный вопрос (обычно ответ «нет» - большинство файловых дескрипторов асинхронные).
A write()
не может завершиться, если у ядра больше нет места для буферизации данных, которые вы хотите записать, и на этот случай влияет неблокирование по сравнению с блокировкой - в случае блокировки write()
заблокировать, пока не освободится место. В неблокирующем случае write()
вернет ошибку (EAGAIN
), и вы можете повторить попытку позже.
Если вы хотите подождать, пока все данные, записанные на оконечное устройство, будут фактически отправлены на аппаратное обеспечение, используйте tcdrain()
- но это, вероятно, не нужно. В качестве альтернативы, если вы хотите, чтобы write()
блокировался до тех пор, пока ваши данные не будут приняты ядром, вы можете использовать fcntl()
, чтобы временно установить дескриптор файла на блокировку.