Pregunta

Estoy buscando llamar a un subproceso con un descriptor de archivo abierto a una tubería determinada de modo que la llamada open () no se cuelgue esperando que el otro lado de la tubería reciba una conexión.

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 tenga /tmp/foobar.pipe abierto para escritura; sin embargo, O_NONBLOCK tiene efectos útiles incluso cuando no recibe comandos, por lo que el comportamiento deseado es que <=> se ejecute de inmediato.

Los mecanismos para hacer esto ejecutando a través de un lenguaje de script alternativo (python, perl, etc.) o un contenedor C que se abre <=> con la bandera <=> son obvios; Estoy buscando una solución de bash puro, en caso de que sea posible.

¿Fue útil?

Solución

Abrir la lectura / escritura de FD en lugar de solo lectura al configurar la canalización evita el bloqueo.

Para ser un poco más específico:

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

evita el comportamiento de bloqueo no deseado, ya que 5<>/tmp/foobar.pipe se abre en modo RW (en lugar de abrir en modo de solo lectura como con 5</tmp/foobar.pipe) aunque O_NONBLOCK todavía está configurado. Gracias a waldner en irc: //irc.freenode.org/#bash por este puntero.

Otros consejos

La única forma en que sé que obtengo este tipo de resultado es un hack:

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

quizás esto ayude :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top