Est-il possible de diviser STDIN entre plusieurs lecteurs, devenant ainsi une file d'attente? Je voudrais passer chaque ligne à un seul lecteur. Les canaux nommés presque travail, mais en même temps se lit interfèrent:Plusieurs lecteurs de FIFO
reader.sh
#!/usr/bin/env bash
while read line
do
echo $line
done < fifo
writer.sh
#!/usr/bin/env bash
while true
do
echo "This is a test sentance"
sleep 1
done
exécution:
mkfifo fifo
./reader.sh &
./reader.sh &
./writer.sh > fifo
sortie occasionnelle (surtout si les lecteurs et les écrivains sont séparés w indows)
This is atetsnac
Ti sats etnesats etne etsnac
isats etnes etsnac
Tisi etsnac
hi etsnac
Ti sats etn
hsi etsnac
Notes:
- Je sais qu'il ya de meilleures approches, juste curieux de savoir si cela pourrait être fait pour travailler
- Je suppose que ce n'est pas un bug comme je l'ai testé à la fois Linux et OSX boîtes
- Je voudrais un consommateur par ligne, ce qui exclut les tee
- Je voudrais consommer STDIN, qui exclut xargs
- G NU coreutils split peut allouer round robin, mais pas d'abord disponible
- GNU parallèle --pipe attend jusqu'à la fermeture de STDIN; Je voudrais allouer dès que possible
Je reproduit ici ce (OS X), mais je ne comprends pas. – Barmar
Je pense que je comprends. Alors que les écritures sur un tube sont atomiques (à condition qu'elles soient plus petites que BUFSIZ), les limites des messages ne sont pas enregistrées dans le tube. Ainsi, les lecteurs concurrents peuvent chacun lire différentes parties d'une entrée. L'appel système pour la lecture d'un flux ne fournit aucun moyen de demander une ligne entière en tant qu'unité. – Barmar
Voir http://stackoverflow.com/questions/20597149/multiple-read-processes-of-the-same-pipe-can-all-read-the-same-message – Barmar