Tại sao mkfifo hành xử như một LIFO?


7

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:


8

Trong

echo 'one' > /tmp/a

Vỏ làm một open(O_WRONLY)trên đường ống và sau đó sinh ra echomà sau đó làm write("one\n").

Các opensẽ chặn cho đến khi một số quá trình khác mở ống trong RD_ONLYhoặc RD_WRmặc dù.

opentừ bạn cũng vậy echo two.

Vì vậy, tại thời điểm bạn làm, more /tmp/abạ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 moreopen(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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.