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.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html –
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) –
@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