Почему именованные каналы не учитывают порядок, в котором были подключены считыватели?

Почему именованные каналы не учитывают порядок, в котором были подключены считыватели?

У меня есть такой тестовый скрипт:

#!/usr/bin/env bash

fif="foooz"; rm "$fif" ; mkfifo "$fif"

( cat "$fif" | cat && echo "1") &

sleep 0.1

( cat "$fif" | cat && echo "2") &

sleep 0.1

( cat "$fif" | cat && echo "3") &

echo "first" > "$fif"

wait;

На выходе я получаю разнообразные результаты, вот эти варианты:

first
1

first
2

first
1
2

first
3

Мой вопрос - почему порядок, в котором читатели присоединяются к именованному каналу, не имеет значения/не соблюдается? Кажется неубедительным, что он почти случаен?

решение1

F=example.fifo
mkfifo $F
cat $F | tee -a >( read B; echo "B=$B" >&2 ) >( read C; echo "C=$C" >&2 ) | (read A; echo "A=$A") &
echo OK > $F
    A=OK
    B=OK
    C=OK
rm $F
  • ">()" — это процесс подстановки
  • внутренние тройниковые работыздесь.

Обратите внимание, что все 3 вывода запускаются одновременно (проверьте, добавив sleep 1;). Если вы хотите дождаться завершения A перед запуском B, то просто используйте цикл или список;

F=example.fifo
mkfifo $F
cat $F | ( read O; echo "A=$O"; echo "B=$O"; echo "C=$O") &
echo OK > $F
    A=OK
    B=OK
    C=OK
rm $F

Связанный контент