Aquí hay algunas opciones que pensé, no estoy seguro de cuál es la correcta.
- Hubo un error de E / S en la lectura de la tubería.
- El proceso de escritura en el otro extremo de la tubería murió con un error.
- Todos los procesos que podrían escribir en la tubería la han cerrado.
- El búfer de escritura de la tubería está lleno.
- El par ha cerrado la otra dirección de la tubería dúplex.
- La escritura falló porque no hay procesos que puedan leer desde la tubería.
- Una llamada al sistema devolvió el error EPIPE y no se instaló ningún controlador de errores.
Respuestas:
Un proceso recibe un SIGPIPE cuando intenta escribir en una tubería (con nombre o no) o en un socket de tipo SOCK_STREAM que no tiene ningún lector.
Generalmente es un comportamiento deseado. Un ejemplo típico es:
No querrá
find
seguir ejecutándose una vez quehead
haya finalizado (y luego haya cerrado el único descriptor de archivo abierto para leer en esa tubería).El
yes
comando generalmente se basa en esa señal para terminar.Escribirá "y" hasta que termine algún comando.
Tenga en cuenta que no es solo cuando los comandos salen, es cuando todos los lectores han cerrado su lectura fd a la tubería. En:
Habrá 1 (la subshell), luego 2 (subshell + sleep), luego 1 (subshell) luego 0 fd lectura de la tubería después de que la subshell cierre explícitamente su stdin, y es entonces cuando
yes
recibirá un SIGPIPE.Arriba, la mayoría de los shells usan a
pipe(2)
whileksh93
y asocketpair(2)
, pero el comportamiento es el mismo en ese sentido.Cuando un proceso ignora el SIGPIPE, la llamada al sistema de escritura (por lo general
write
, pero podría serpwrite
,send
,splice
...) vuelve con unEPIPE
error. Por lo tanto, los procesos que desean manejar la tubería rota manualmente ignorarían SIGPIPE y tomarían medidas ante un error EPIPE.fuente
(6)
Aunque a menos que duplique los descriptores y la bifurcación, solo puede haber un proceso para comenzar: en general, una tubería tiene un lector y un escritor, y cuando uno de ellos cierra la conexión, la tubería está desactivada. Si está utilizando una tubería con nombre, puede hacer múltiples conexiones (en serie) con ella, pero cada una representa una nueva tubería en este sentido. Entonces, una "tubería" a un hilo o proceso es sinónimo de un descriptor de archivo.
De
man 7 pipe
:Entonces, un "tubo roto" es para el escritor lo que EOF es para el lector.
fuente
Una tubería rota ocurre cuando el proceso de lectura sale antes que el proceso de escritura. Entonces iría con (6)
fuente