Il fonctionne de manière similaire à send()
: si la prise est définie comme O_NONBLOCK
et l'opération bloquerait, sendfile()
retourne immédiatement et définit errno
à EAGAIN
. Dans ce cas, vous devez attendre un moment, puis réessayer (peut-être en utilisant une fonction comme select()
pour savoir quand il est prêt). De plus, gardez à l'esprit que même s'il réussit, il risque de ne pas écrire tous les octets que vous avez demandés dans un appel de fonction unique. Vérifiez toujours la valeur de retour:
Si le transfert a réussi, le nombre d'octets écrits sur out_fd est renvoyé. En cas d'erreur, -1 est renvoyé et errno contient le code d'erreur.
Vous pouvez également jeter un oeil à la man page for sendfile()
Pour développer un peu: si 'sendfile()' retourne une valeur> 0, alors que le nombre d'octets ont été envoyés avec succès - il n'y a pas besoin d'attendre achèvement. "Non-bloquant" n'implique pas "asychrone". – caf
Juste pour confirmer: select() rapportera le socket comme étant inscriptible (FD_ISSET() == true) quand le bloc courant a été vidé. Vous devez ensuite appeler à nouveau sendfile(), mais conserver un nouveau décalage. – Leolo
@caf: Que se passe-t-il lorsque le descripteur de fichier * input * bloque? –