Работает очень похоже на send()
: если сокет установлен как O_NONBLOCK
и операция блокируется, sendfile()
немедленно возвращается и устанавливает errno
в EAGAIN
. В этом случае вам придется подождать некоторое время, а затем повторить попытку (возможно, с помощью функции, такой как select()
, чтобы узнать, когда она будет готова).
Также имейте в виду, что даже если это удастся, он может записать не все байты, запрошенные вами за один вызов функции. Всегда проверяйте возвращаемое значение:
Если передача прошла успешно, число байтов, записанных в out_fd, равно
вернулся. При ошибке возвращается -1, и errno устанавливается соответствующим образом.
Вы также можете взглянуть на справочную страницу для sendfile ()