J'ai essentiellement le code suivant:
int fileWrite(int file, void * pBuffer, size_t size)
{
size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
if (bytesWritten != size)
{
return -1;
}
return 0;
}
Cela fonctionne si la taille est de 1 Go, mais lorsque la taille est de ~ 2 Go, il reste systématiquement 4 octets. Je peux résoudre ce problème en enveloppant l'écriture dans une boucle et en déplaçant le tampon vers le haut, mais je suis curieux de savoir pourquoi il échoue toujours.
Par exemple, si la taille est 2147483648, l'écriture écrit uniquement 2147479552, laissant 4096 non écrit. Pourquoi cela arriverait-il et est-il correct de toujours boucler l'écriture dans une boucle?
c
linux
system-calls
TreeWater
la source
la source
write
consommées à la fois dépendent du type de récepteur de donnéesfile
(par exemple, fichier "normal", pipe, socket de flux, socket de datagramme, ...). Peux-tu être plus précis?write
le fichier entier à la fois? L'approche habituelle consiste à diffuser les données une taille de tampon à la fois jusqu'à ce que vous écriviez tout.write()
n'est pas nécessaire de tout écrire (ce qui vaut également pour les petits tampons)SSIZE_MAX
restriction. Lawrite()
spécification indique qu'elle n'est pas obligée d'écrire le tampon complet, même si c'est presque toujours le cas. Le code sans boucle dans la question est un bogue.Réponses:
Vous pouvez trouver la réponse dans
man 2 write
:Et à partir de la
write()
description de la page de manuel:la source