Nếu tôi làm.
mkfifo /tmp/a
echo 'one'>/tmp/a
trong khi từ một nhà ga khác
echo 'two'>/tmp/a
và từ một thiết bị đầu cuối thứ ba
more /tmp/a
Tại sao tôi có được như là đầu ra của lệnh cuối cùng này?
two
one
Nếu tôi làm.
mkfifo /tmp/a
echo 'one'>/tmp/a
trong khi từ một nhà ga khác
echo 'two'>/tmp/a
và từ một thiết bị đầu cuối thứ ba
more /tmp/a
Tại sao tôi có được như là đầu ra của lệnh cuối cùng này?
two
one
Câu trả lời:
Trong
echo 'one' > /tmp/a
Vỏ làm một open(O_WRONLY)
trên đường ống và sau đó sinh ra echo
mà sau đó làm write("one\n")
.
Các open
sẽ chặn cho đến khi một số quá trình khác mở ống trong RD_ONLY
hoặc RD_WR
mặc dù.
Và open
từ bạn cũng vậy echo two
.
Vì vậy, tại thời điểm bạn làm, more /tmp/a
bạn đã có hai quy trình sẵn sàng để khai hỏa mà chưa mở fifo mà hãy để một mình viết bất cứ điều gì cho nó. Cái nào trong hai cái đó sẽ được lên lịch ngay khi more
nó open(RD_ONLY)
sẽ là ngẫu nhiên.
Để tránh bị chặn, bạn có thể làm:
exec 3<> /tmp/a
để mở khóa đường ống trước, sau đó chạy các lệnh của bạn sẽ không chặn cho đến khi đường ống đầy.
Tuy nhiên, xin lưu ý rằng phần trên sẽ hoạt động trên Linux nhưng không phải trên mọi Unix hoặc Unix. Hành vi khi mở một đường ống ở chế độ đọc-ghi không được chỉ định bởi POSIX.