¿Qué es una "tubería" y cómo se puede "romper"?

12

ingrese la descripción de la imagen aquí

Recibí el error "tubería rota" de Xcode una vez demasiados. Ahora tengo curiosidad por saber exactamente qué es una tubería.

¿Cuál es el concepto de una "tubería" y cómo se puede "romper"?

Moshe
fuente
3
Una tubería es un tubo largo que contiene muchos datos. Si el extremo receptor de la tubería deja de extraer los datos, comienza a retroceder y la tubería explota. La computadora informa al final que está introduciendo datos en la tubería que esto ha sucedido.
Omnifarious

Respuestas:

7

Una tubería es simplemente un mecanismo de comunicación entre procesos (IPC) utilizado para conectar la salida estándar de un proceso a la entrada estándar de otro.

Un ejemplo es cuando desea buscar en un archivo la palabra "pax":

cat filename | grep pax

y sí, sé que puedes hacer grepel archivo directamente, pero eso no explica cómo funciona, ¿verdad?

Esto conecta la salida estándar del catcomando a la entrada estándar del grepcomando. catenvía el contenido del archivo a su salida estándar y greplee su archivo (en este caso) desde su entrada estándar. Al conectar procesos como este, puede crear sus propias herramientas que consisten en cualquier número de segmentos de tubería. Cosas como:

show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20

Una tubería rota es aquella en la que (por lo general) el receptor de los datos ha cerrado la conexión mientras el remitente todavía está tratando de enviar cosas.

Por ejemplo, si envía un archivo grande a través de un programa de buscapersonas (para verlo página por página):

cat myfile | pager

y luego haga una CTRL-BREAK, esto puede hacer que el pagerproceso cierre su tubería de entrada antes de que cathaya terminado de usarlo. Esa es una posibilidad para obtener esta tubería rota.


Desde una búsqueda rápida en Google , este problema particular parece estar relacionado con implementaciones ad hoc y las soluciones que se ofrecen generalmente incluyen salir de la mayoría de su software y reiniciar la mayoría de sus dispositivos.

Esto es probablemente lo suficientemente grave como para informar el problema a Apple. Cuantos más desarrolladores se quejen de ello, es más probable que se haga algo para solucionarlo.


fuente
Entonces, ¿qué es una tubería "rota"?
Moshe
pr -e4 -n ten-thousand-lines.c | sed 10qtermina con una tubería rota. Si te prmolesta decirte que recibió la señal SIGPIPE es otro asunto; puede simplemente salir como resultado de la señal (generando un estado de salida distinto de cero).
Jonathan Leffler
Las tuberías no conectan necesariamente la entrada y salida "estándar". Es posible pasar programáticamente cualquier E / S a través de una tubería, aunque desde la línea de comandos está en lo correcto.
CarlF
2

El |personaje a menudo se llama una tubería. En los varios shells de UNIX (que yo sepa) se puede usar para canalizar la salida de un comando a la entrada de otro.

cat myfile.txt | head

El headcomando solo muestra las primeras líneas de su entrada. En ese punto, cierra su entrada. Esto plantea un problema para el comando que generaba la entrada. ¿A dónde escribe? Cada vez que tenemos esta situación, o la situación cuando el proceso de escritura termina antes de que el lector termine, se llama "tubería rota".

Para evitar que el catcomando permanezca para siempre, el estándar UNIX define una señal especial ( SIGPIPE , señal 13 ) a la que envía cat. La acción predeterminada para esta señal es matar el proceso, lo que hace que el catfinal sea agradable.

Parece que la aplicación que está utilizando ha instalado un controlador de señal para todas las señales, incluido SIGPIPE, que crea el pequeño mensaje emergente que ve.

bukzor
fuente
1

Una tubería es un mecanismo de IPC en sistemas Unix. Una tubería tiene dos extremos, un final de lectura y un final de escritura. Los datos que se escriben en el extremo de escritura se pueden leer desde el extremo de lectura y salen en el orden en que se escribieron.

En el mundo de la línea de comandos de Unix, las canalizaciones son una forma muy común de conectar programas para hacer un trabajo. Por ejemplo sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz', leerá en el archivo, fred.txtreemplazará todas las instancias de la cadena foocon la cadena, barluego buscará en el resultado líneas que contengan barseguido de algún número de caracteres, y luego baz.

Eso, por supuesto, no parece terriblemente útil. Pero estoy seguro de que si lo piensa, puede ver cómo podría poner todo esto en usos interesantes, especialmente una vez que tenga programas como awko perla su disposición.

El sistema de tuberías ha sido parte de Unix desde el principio. Y si un proceso en su canalización finaliza, generalmente desea que salgan todos los programas de la canalización. Esto significa que, por defecto, un proceso que escribe en una tubería donde el proceso en el extremo de lectura se ha ido recibirá una SIGPIPEseñal. Y si está bloqueada esa señal, writeseguirá fallando con un tipo especial de error que indica que la tubería se ha "roto".

El manejo predeterminado de SIGPIPEmata el proceso que lo recibe. Y si no es la 'cabeza' de la tubería, todo se SIGPIPEpropaga de regreso a la cadena.

De lo que se queja Xcode es de que comenzó un subprograma para hacer algo con una tubería que lo conduce, y ese subprograma murió inesperadamente dejando la tubería rota.

De todo género
fuente
0

Una tubería "rota" es aquella en la que un extremo ha sido close()'d' y el otro está siendo leído o escrito. Por ejemplo, en el siguiente comando de shell:

cat foo | less

El catproceso contiene el final de escritura de la tubería, y el lessproceso de lectura. Si el proceso del lector cierra la tubería, la tubería se rompe (y, por lo tanto, es inútil); el proceso de escritura recibirá el error "tubería rota" del sistema operativo.

Michael Trausch
fuente
1
En realidad, solo está "roto" si el lector lo cierra. Si el escritor lo cierra (como catobviamente lo hará tan pronto como esté terminado), el lector verá un final de archivo normal.
Random832
Vaya, tienes toda la razón ... Actualizaré mi respuesta.
Michael Trausch