linux - tag - ¿En qué circunstancias devuelve 0 el sistema read() syscall?
puddletag (2)
Estoy viendo la read
syscall en Unix, que (al menos en Linux) tiene esta firma: [1]
ssize_t read(int fd, void* buf, size_t count);
Supongamos que la llamada se realiza correctamente (es decir, no hay valores de retorno negativos) y que count > 0
(es decir, el búfer puede almacenar una cantidad de bytes distinta de cero). ¿En qué circunstancias read()
devolver 0? Puedo pensar en lo siguiente:
- Cuando
fd
refiere a un archivo normal y se ha llegado al final del archivo. - Cuando
fd
refiere al extremo receptor de una tubería, socket o FIFO, el extremo de envío se ha cerrado y el búfer propio de pipe / socket / FIFO se ha agotado. - Cuando
fd
refiere al lado esclavo de un dispositivo terminal que está enICANON
yCtrl-D
se ha enviado al lado maestro mientras el búfer de línea estaba vacío.
Tengo curiosidad por saber si hay otras situaciones de las que no tengo conocimiento, donde read()
volvería con un resultado de 0. Estoy especialmente interesado (por razones) en situaciones como la última en la lista anterior , donde read()
devuelve 0 una vez, pero las llamadas posteriores a read()
en el mismo FD podrían devolver un resultado distinto de cero. Si una respuesta solo se aplica a un cierto sabor de Unix, todavía estoy interesado en escucharla.
[1] Sé que esta firma es para el contenedor libc, no para el syscall real, pero eso no es importante en este momento.
Normalmente, un valor de retorno de 0
siempre significa final de archivo. Sin embargo, si especifica 0
como el número de bytes para leer, siempre devolverá 0
menos que se detecte un error.
Los dispositivos terminales son un caso especial. Si el terminal está en modo cocinado, al escribir Control-d, el controlador del dispositivo debe regresar de cualquier read()
pendiente inmediatamente con el contenido del búfer de edición de entrada, en lugar de esperar a que el usuario ingrese una nueva línea. Si el búfer está vacío, esto da como resultado una lectura de longitud cero. Así es como las aplicaciones tratan el carácter de EOF al principio de una línea como EOF.
- Si el sistema de archivos físicos no admite lecturas simples de directorios, read () devolverá 0 si se usa para un directorio. Los usuarios deben usar Opendir () y readdir () en su lugar.
- Si ningún proceso tiene el canal abierto para escribir, read () devuelve 0 para indicar el final del archivo.
- Si la conexión se interrumpe en un socket de flujo, pero no hay datos disponibles, la función read () devuelve 0 bytes como EOF.