2008-10-07 9 views
7

Estoy buscando llamar a un subproceso con un descriptor de archivo abierto en una tubería dada de tal manera que la llamada open() no cuelgue esperando que el otro lado de la tubería recibir una conexiónConfigurando tuberías leyendo desde tuberías nombradas sin bloquear en bash

Para demostrar:

$ mkfifo /tmp/foobar.pipe 
$ some_program --command-fd=5 5</tmp/foobar.pipe 

En este caso, some_program no se ejecuta hasta que algún proceso tiene /tmp/foobar.pipe abierto para escritura; sin embargo, some_program tiene efectos útiles incluso cuando no está recibiendo comandos, por lo que el comportamiento deseado es some_program para ejecutarse inmediatamente.

Mecanismos para hacer esto mediante la ejecución a través de un lenguaje de scripts alternativo (python, perl, etc.) o un contenedor C que abre /tmp/foobar.pipe con el indicador O_NONBLOCK son obvios; Estoy buscando una solución pura-bash, en caso de que sea posible.

Respuesta

9

La apertura de la FD de lectura/escritura en lugar de sólo lectura cuando la creación de la la tubería evita el bloqueo.

a ser un poco más específico:

$ mkfifo /tmp/foobar.pipe 
$ some_program --command-fd=5 5<>/tmp/foobar.pipe 

impide que el comportamiento de bloqueo no deseado, como 5<>/tmp/foobar.pipe abre en modo RW (en oposición a la abertura en el modo de sólo lectura con 5</tmp/foobar.pipe), aunque O_NONBLOCK sigue estando ajustado. Gracias a waldner en irc: //irc.freenode.org/#bash por este puntero.

3

La única forma que conozco de conseguir este tipo de resultado es un truco:

mkfifo /tmp/foobar.in 
mkfifo /tmp/foobar.out 
(cat </tmp/foobar.in) >/tmp/foobar.out & 
some_program --command-fd=5 5</tmp/foobar.out 

tal vez esto ayuda :-)

+0

tienes razón, era un error tipográfico. solo lo edité. Y sí, el proceso de fondo es feo, es por eso que lo llamé hack :) – Sec

Cuestiones relacionadas