¿Escribirá(2) siempre escribirá menos o igual que SSIZE_MAX?
posix (3)
La especificación POSIX para write()
dice:
Si el valor de
nbyte
es mayor que {SSIZE_MAX}, el resultado está definido por la implementación.
Por lo tanto, cualquier intento de escribir más de SSIZE_MAX
bytes conduce a un comportamiento que no es obligatorio por POSIX, pero que debe ser documentado por el sistema (es un comportamiento definido por la implementación, no indefinido). Sin embargo, diferentes sistemas pueden manejarlo de manera diferente, y no hay nada que impida que un sistema informe un error (quizás errno
configurado en EINVAL
) y otro que escriba SSIZE_MAX
bytes e informe de eso, dejando que la aplicación vuelva a intentar el resto y otros Los sistemas podrían ser inventivos y hacer las cosas de manera diferente.
Si tiene un sistema de 64 bits, es probable que SSIZE_MAX
sea mayor que la cantidad de espacio en disco en el centro de datos más grande del mundo (posiblemente en un orden de magnitud o más, incluso permitiendo la NSA y Google), por lo que es poco probable que pueda tener problemas reales con esto, pero en sistemas de 32 bits, fácilmente podría tener más de 2 GiB de espacio y si ssize_t
es de 32 bits, debe lidiar con todo esto. (En Mac OS X 10.10.3, una compilación de 32 bits tiene un tamaño de 4 bytes y ssize_t
, al menos de forma predeterminada).
La firma de función para write(2)
es ssize_t write(int fd, const void *buf, size_t count)
. En general, el valor máximo de size_t
es mayor que el de ssize_t
. ¿Significa esto que la cantidad de datos que se puede escribir realmente es SSIZE_MAX
lugar de SIZE_MAX
? Si ese no es el caso, ¿qué sucede cuando el número de bytes escritos es mayor que SSIZE_MAX
con respecto a los desbordamientos?
Básicamente, me pregunto si esa cantidad de datos escritos por write
está delimitada por SSIZE_MAX
o SIZE_MAX
.
POSIX define el tipo ssize_t
como un tipo firmado para poder almacenar al menos 32767 ( _POSIX_SSIZE_MAX
) sin ninguna otra garantía. Por lo tanto, su valor máximo puede ser menor que el valor máximo de size_t
.
ssize_t
Se utiliza para un recuento de bytes o una indicación de error.
Por lo tanto, es posible que la cantidad de bytes que solicitaste para escribir sea mayor que lo que ssize_t
puede contener. En ese caso, POSIX lo deja a la implementación.
De las especificaciones POSIX de write()
:
ssize_t write(int fildes, const void *buf, size_t nbyte);
Si el valor de nbyte es mayor que {SSIZE_MAX}, el resultado está definido por la implementación.
Sí, la cantidad de datos que se pueden escribir en una sola llamada para escribir se limita a lo que se puede mantener en ssize_t. Para aclaraciones, consulte la página de documentación relevante de glibc . Para citar esa página, "Su programa siempre debe llamar escribir en un bucle, iterando hasta que se escriban todos los datos". (énfasis agregado) Esa página también aclara que ssize_t se usa para representar el tamaño de los bloques que se pueden leer o escribir en una sola operación.