Tengo esencialmente el siguiente código:
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;
}
Funciona si el tamaño es de 1 GB, pero cuando el tamaño es de ~ 2 GB, obtiene 4K bytes de manera constante. Puedo arreglar esto envolviendo la escritura en un bucle y moviendo el búfer hacia arriba, pero tengo curiosidad por saber por qué siempre falla.
Por ejemplo, si el tamaño es 2147483648, escribir solo escribe 2147479552, dejando 4096 sin escribir. ¿Por qué sucedería esto y es correcto envolver siempre la escritura en un bucle?
c
linux
system-calls
ÁrbolAgua
fuente
fuente
write
se consumirán a la vez dependen del tipo de sumidero de datosfile
(por ejemplo, archivo "normal", canalización, socket de flujo, socket de datagrama, ...). ¿Puedes ser mas específico?write
todo el archivo a la vez? El enfoque habitual es transmitir los datos del tamaño de un búfer a la vez hasta que escriba todo.write()
no tiene que escribir todo (que va para las pequeñas memorias intermedias también)SSIZE_MAX
restricción. Lawrite()
especificación dice que no tiene ninguna obligación de escribir el búfer completo, incluso si casi siempre lo hace. El código sin bucle en la pregunta es un error.Respuestas:
Puedes encontrar la respuesta en
man 2 write
:Y de la
write()
descripción de la página del manual:fuente