2008-10-07 11 views
7

Je cherche à appeler un sous-processus avec un descripteur de fichier ouvert à un canal donné de telle sorte que l'appel open() ne soit pas en attente de l'autre côté du tube recevoir une connexion.Configurer les pipelines lisant à partir de tubes nommés sans bloquer dans bash

Pour démontrer:

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

Dans ce cas, some_program est pas exécuté jusqu'à ce qu'un processus a /tmp/foobar.pipe ouvert pour l'écriture; cependant, some_program a des effets utiles même s'il ne reçoit pas de commandes, donc le comportement souhaité est some_program pour être exécuté immédiatement. Les mécanismes permettant de le faire en exécutant un langage de script alternatif (python, perl, etc) ou un wrapper C qui ouvre /tmp/foobar.pipe avec le drapeau O_NONBLOCK sont évidents; Je cherche une solution pur-bash, devrait-on être possible.

Répondre

9

Ouverture de la FD lecture/écriture plutôt que lecture seule lors de la mise en place du pipeline empêche le blocage.

être un peu plus précis:

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

empêche le comportement de blocage indésirable, comme 5<>/tmp/foobar.pipe ouvre en mode RW (par opposition à l'ouverture en mode lecture uniquement avec 5</tmp/foobar.pipe), bien que O_NONBLOCK est toujours fixé. Merci à waldner sur irc: //irc.freenode.org/#bash pour ce pointeur.

3

La seule façon que je sais obtenir ce genre de résultat est 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 

peut-être cela aide :-)

+0

vous avez raison, c'était une faute de frappe. juste l'édité. Et oui le processus d'arrière-plan est moche, c'est pourquoi je l'ai appelé un hack :) – Sec