Configurar tuberías que leen de tuberías con nombre sin bloquear en bash
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.
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 :-)