2011-03-26 20 views
6

Los read y write funciones (y parientes como send, recv, readv, ...) pueden devolver un número de bytes menor que la longitud de lectura/escritura solicitada haya sido interrumpida por una señal (bajo ciertas circunstancias), y tal vez en otra casos también. ¿Existe un conjunto bien definido de condiciones para cuando esto puede suceder, o depende en gran medida de la implementación? Aquí hay algunas preguntas particulares que estoy interesado en las respuestas a:¿Cuáles son las condiciones bajo las cuales puede ocurrir una lectura/escritura breve?

  • Si un controlador de señal se interrumpe no (SA_RESTART) que hará que las operaciones de IO interrumpidos antes de los datos se transfieren a ser reiniciado después de las declaraciones de manejador de señales . Pero si una lectura parcial/escritura ya se ha producido y el manejador de la señal es no interrumpen, será la llamada al sistema volver inmediatamente con la longitud parcial, o será reanudado intentar leer/escribir el resto?
  • Las funciones de lectura obvia pueden devolver lecturas cortas en red, tubería y descriptores de archivos de terminal cuando hay menos datos disponibles que la cantidad solicitada. Pero, ¿pueden las funciones de escritura devolver escrituras cortas en estos casos debido a un tamaño de búfer limitado, o bloquearán hasta que se puedan escribir todos los datos?

Me interesarían los tres comportamientos requeridos por las normas, comunes y específicos de Linux.

Respuesta

2

Para su segunda pregunta: escritura puede volver escrituras cortas para un tamaño de búfer limitado si es no bloqueante

+0

http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html –

+0

Si se trata de bloqueo, sin embargo, no es una garantía de que no volverá escrituras cortas? (a menos que sea causado por una señal) –

+0

@R .. no creo que esté garantizado. Si no me equivoco hay otras situaciones en las que una escritura podría fallar: por ejemplo, si se quita la tarjeta de red, mientras que el sistema operativo está escribiendo algunas datas más .. Creo que incluso en esa situación de escritura debe devolver bytes cortos. No estoy seguro de eso Tendría que revisar mi código de red que no tengo conmigo ahora mismo. – Heisenbug

1

Hay al menos una condición estándar que puede causar escritura en un archivo normal para devolver un corto tamaño:

Si una escritura() solicita que más bytes ser escritos que hay espacio para (por ejemplo, [XSI] el límite de tamaño de archivo del proceso o el final físico de un medio), sólo como muchos bytes como allí es espacio para que se escriban diez. Para ejemplo, supongamos que hay espacio para 20 bytes más en un archivo antes de llegar a un límite . Una escritura de 512 bytes dará como resultado return 20. La siguiente escritura de un número de bytes distinto de cero dará un retorno de falla (excepto como se indica en a continuación).

Cuestiones relacionadas