![명명된 파이프가 독자의 추가 순서를 존중하지 않는 이유는 무엇입니까?](https://linux55.com/image/154848/%EB%AA%85%EB%AA%85%EB%90%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%EA%B0%80%20%EB%8F%85%EC%9E%90%EC%9D%98%20%EC%B6%94%EA%B0%80%20%EC%88%9C%EC%84%9C%EB%A5%BC%20%EC%A1%B4%EC%A4%91%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이 테스트 스크립트가 있습니다.
#!/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;
). B를 시작하기 전에 A가 완료될 때까지 기다리려면 루프나 목록을 사용하면 됩니다.
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