2011-02-24 13 views
11

Quiero entender que ¿cómo funciona el intérprete de órdenes ejecutado? p.ej. gato | Más. Soy consciente de que para ejecutar un shell de comando normal hace un tenedor, lo ejecuta y luego vuelve el niño. Pero, ¿cómo maneja internamente el shell la ejecución de los comandos canalizados?¿Cómo ejecuta Shell los comandos canalizados?

Respuesta

12

Teniendo en cuenta por ejemplo cat | grep, la cáscara primeros sí horquillas para iniciar cat, y luego horquillas sí mismo una vez más para iniciar grep.

Antes de llamar a una de las exec* familias de funciones en los dos procesos recién creados para iniciar los dos programas, la parte difícil es configurar la tubería y redirigir los descriptores. La llamada al sistema pipe(2) se utiliza en el proceso de shell antes de bifurcar para devolver un par de descriptores que ambos hijos heredan: un final de lectura y un final de escritura.

El final de lectura se cerrará en el primer proceso (cat) y stdout se redireccionará al final de escritura mediante la llamada al sistema dup2(2). De forma similar, el final de escritura en el segundo proceso (grep) se cerrará y stdin se redireccionará al final de lectura nuevamente usando dup2(2).

De esta manera, ambos programas desconocen la existencia de una tubería porque solo funcionan con la entrada/salida estándar.

+0

Hola Blagovest, estoy un poco confundido. ¿Es grep un niño de gato o un niño de concha? ¿Cómo sabe el gato que tiene que pasar por grep? – cppdev

+0

Tienes razón, bash en particular no crearía el segundo proceso como hijo del primero, pero el principio aún se cumple y ambos procesos siguen siendo hijos del caparazón. –

4

Configura una tubería usando la llamada al sistema pipe, bifurca dos procesos en lugar de uno y conecta un extremo del conducto al primer proceso 'stdout y el otro extremo al segundo proceso' stdin.

+0

¿Puede explicar cómo unirse a stdout de un proceso con stdin de otro? – cppdev

+1

@cppdev: usando 'dup2', pero ya has descubierto la respuesta de Blagovest. @Downvoter: ¿Qué pasa con esta respuesta, excepto que es demasiado corta? –

Cuestiones relacionadas