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"?
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"?
Respuestas:
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 grep
el archivo directamente, pero eso no explica cómo funciona, ¿verdad?
Esto conecta la salida estándar del cat
comando a la entrada estándar del grep
comando. cat
envía el contenido del archivo a su salida estándar y grep
lee 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 pager
proceso cierre su tubería de entrada antes de que cat
haya 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.
pr -e4 -n ten-thousand-lines.c | sed 10q
termina con una tubería rota. Si te pr
molesta 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).
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 head
comando 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 cat
comando 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 cat
final 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.
Este error parece aparecer con bastante frecuencia. /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe es "... un error interno en la capacidad de Xcode para hablar con su teléfono. No lo hace significa que has hecho algo mal, es un error en el sistema de desarrollo "
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.txt
reemplazará todas las instancias de la cadena foo
con la cadena, bar
luego buscará en el resultado líneas que contengan bar
seguido 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 awk
o perl
a 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 SIGPIPE
señal. Y si está bloqueada esa señal, write
seguirá fallando con un tipo especial de error que indica que la tubería se ha "roto".
El manejo predeterminado de SIGPIPE
mata el proceso que lo recibe. Y si no es la 'cabeza' de la tubería, todo se SIGPIPE
propaga 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.
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 cat
proceso contiene el final de escritura de la tubería, y el less
proceso 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.
cat
obviamente lo hará tan pronto como esté terminado), el lector verá un final de archivo normal.