2012-09-21 25 views
6

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?

+0

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

+8

[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. –

+4

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

Respuesta

0

Creo que recuerde que el sistema asigna el número de bytes que le da a la función. Pero no estoy seguro. Tal vez deberías probar las páginas man de size_t y ssize_t.

+0

No he podido encontrar ninguna página man para eso. – Marcus

+0

Cometí un error, está en la carpeta de inclusión, pero no sé en cuál está = S ¡Espero que lo encuentres! –

+0

¡No te preocupes! Gracias por tu ayuda. : D – Marcus

2

No creo que haya un límite estricto, depende de a qué apunta fd. Si se trata de un archivo en el sistema de archivos, por ejemplo, el controlador de sistema de archivos se ahogue si se excede el "límite de tamaño máximo del archivo", volviendo EFBIG error:

EFBIG Se hizo un intento de escribir un archivo que excede el implementación: tamaño de archivo máximo definido o el límite de tamaño de archivo de proceso.

+0

Correcto, ese parámetro simplemente pasa a través de la implementación específica del dispositivo. –

+0

Si 'fd' hace referencia a un socket (normalmente uno que no es de bloqueo) uno podría obtener' ENOMEM'. – alk

+0

No estoy exactamente preocupado por el caso de los enchufes. El punto principal es: si el dispositivo admite operaciones de escritura mayores que SSIZE_MAX, el tipo de devolución no puede manejar la cantidad real de bytes escritos. 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. – Marcus

1

buscado en Google:

Si el valor de nbyte es mayor que {} SSIZE_MAX , el resultado es definido por la implementación.

Fuente: http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html

+0

Sé que es la implementación definida (como se indica en la mayoría de las publicaciones anteriores). Sin embargo, no pude encontrar un solo lugar donde se explica ese comportamiento para una implementación en particular. Creo que la "implementación" significa un dispositivo/sistema de archivos/cualquier implementación. ¿Conoces algún lugar donde se observe esta situación? – Marcus

+0

Implementación significa quien escribió esa función. Probablemente su proveedor de compilador o proveedor de sistema operativo. Verifique con los documentos del compilador o sistema operativo. Como etiquetó a Linux, probablemente sea GCC con la biblioteca C de GNU. Lamentablemente, los documentos para él http://www.gnu.org/software/libc/manual/html_node/I_002fO-Primitives.html#I_002fO-Primitives no especifican el comportamiento definido de implementación (es posible que desee presentar un informe de error en la documentación)) A menos que usted (el mayor número de personas) crea que "el código es la documentación", en cuyo caso simplemente vaya a ver el código (que es el objetivo de la fuente abierta). –

+0

Probablemente coloque un informe de error. Gracias. – Marcus

Cuestiones relacionadas