El prototipo llamada al sistema de escritura es:escribir llamada al sistema, ¿cuál es el número de bytes límite?
ssize_t write(int fd, const void *buf, size_t count);
El parámetro de recuento está firmado, y se firmó el valor de retorno.
La página de ayuda dice:
En caso de éxito, el número de bytes escritos se devuelve (cero indica nada fue escrito). En caso de error, se devuelve -1 y errno
se establece de forma adecuada.
Sin embargo, no dice cuál es el límite del parámetro de conteo. Todavía no dice el comportamiento cuando el recuento es mayor que SSIZE_MAX
.
Considerar la escritura es una llamada al sistema que se puede usar para dispositivos/archivos genéricos/lo que sea, si el dispositivo admite operaciones de escritura mayores que SSIZE_MAX, el tipo devuelto no puede manejar la cantidad real de bytes escritos.
No tiene sentido para mí poder pasar un número sin signo de bytes y obtener un número firmado de bytes como resultado. ¿Por qué no simplemente pasar un número firmado?
Se siente como el prototipo de la función de escritura en una especie de error propenso, o al menos deja un posible agujero en el camino.
¿Alguien conoce los detalles al respecto o dónde puedo encontrar esta información?
no sé yo mismo, pero creo que el límite es de tamaño entero sin signo. Lo que significa que debe poder escribir 4294967296 bytes a la vez. El valor de retorno en este caso sería -1 (y tendría que comprobar errno para asegurarse de que en realidad es un error) – ATaylor
[dice POSIX] (http://pubs.opengroup.org/onlinepubs/007904875/functions/ write.html) "Si el valor de nbyte es mayor que {SSIZE_MAX}, el resultado está definido por la implementación", por lo que falta la página de manual de Linux, debería describir esto. –
Es costumbre escribir() con fragmentos pequeños. Tengo dificultades para imaginar una situación en la que escribir gigabytes con un solo syscall sería una buena idea. – willglynn