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:
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.
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.
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.
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.
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.
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":
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 delgrep
comando.cat
envía el contenido del archivo a su salida estándar ygrep
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: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):
y luego haga una CTRL-BREAK, esto puede hacer que el
pager
proceso cierre su tubería de entrada antes de quecat
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.
fuente
pr -e4 -n ten-thousand-lines.c | sed 10q
termina con una tubería rota. Si tepr
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.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íacat
. La acción predeterminada para esta señal es matar el proceso, lo que hace que elcat
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.
fuente
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 "
fuente
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 cadenafoo
con la cadena,bar
luego buscará en el resultado líneas que contenganbar
seguido de algún número de caracteres, y luegobaz
.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
operl
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 seSIGPIPE
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.
fuente
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:El
cat
proceso contiene el final de escritura de la tubería, y elless
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.fuente
cat
obviamente lo hará tan pronto como esté terminado), el lector verá un final de archivo normal.