Sự khác biệt giữa bốn lệnh đó (fifo, thay thế quá trình, chuyển hướng là gì)


8

Mục tiêu của tôi là tạo ra một máy chủ echo đơn giản bằng cách sử dụng ncvà một fifo. Tôi không tìm kiếm cách tốt nhất để làm điều đó, tôi chỉ đang cố gắng hiểu ngữ nghĩa của các lệnh sau (khi nào xảy ra ngã ba, tại sao, nó thay đổi gì, tại sao các lệnh lại hoạt động khác nhau ...).

Tôi đang sử dụng Bash, vì vậy tôi không chắc chắn nếu tất cả các lệnh sẽ làm việc với một POSIX shhay zsh, ksh...

Dưới đây là bốn lệnh tôi đang đề cập trong tiêu đề (giả sử rằng tôi đã làm mkfifo fifo):

cat fifo | nc -l localhost 8888 > fifo
exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&-
nc -l localhost 8888 <(cat fifo) > fifo
nc -l localhost 8888 < fifo > fifo

Bây giờ tôi sẽ mong đợi 4 lệnh sẽ làm điều tương tự, ít nhất là hai lệnh cuối cùng làm điều tương tự.

  1. Lệnh đầu tiên hoạt động như mong đợi, một máy chủ echo đơn giản sẽ tắt khi máy khách đóng kết nối.
  2. Hành vi như 1.
  3. Tôi có thể kết nối với máy chủ, gửi dữ liệu, nhưng tôi không bao giờ nhận lại được gì. Khi tôi đóng kết nối máy khách, máy chủ sẽ tắt.
  4. Không thể kết nối với máy chủ, máy chủ lắng nghe mãi mãi.

Câu trả lời:


8

Chìa khóa ở đây là việc mở một FIFO là một hoạt động chặn. Trả openvề duy nhất một khi cả hai đầu được kết nối, tức là một khi fifo được mở cho cả đọc và viết.

người đàn ông fifo (7)

Normally, opening the FIFO blocks until the other end is opened also.

Trong trường hợp thứ nhất, shell forks thực thi đường ống, do đó, việc mở fifo để đọc ( cat fifo) và mở fifo để viết ( > fifo) xảy ra trong các quy trình riêng biệt, do đó xảy ra độc lập.

Trong trường hợp thứ 2, việc mở để đọc và mở để viết ( 3<>fifo) xảy ra trong một bước duy nhất.

Trong trường hợp thứ 3, <(cat fifo)mở rộng thành tên tệp, vd /dev/fd/42. Vì vậy, nó giống như bạn đang chạy nc -l localhost 8888 /dev/fd/42 > fifo. Bạn cần thêm một khoản <tương đương, vd nc -l localhost 8888 < <(cat fifo) > fifo.

Trong trường hợp thứ 4, shell đang cố mở fifo để đọc ( < fifo) và mở nó để viết ( > fifo) như một phần của quy trình tương tự. Vỏ làm chúng một lúc, từ trái sang phải. Vì vậy, nó cố gắng mở fifođể đọc, và chặn mãi mãi, chờ đợi một cái gì đó mở fifođể viết. Tôi nghĩ rằng bạn sẽ thấy rằng trong trường hợp này, ncthậm chí chưa bao giờ bắt đầu và cổng không bao giờ được mở để nghe.


Ồ vâng, lỗi ngớ ngẩn ở # 3, nhưng cuối cùng kết quả vẫn như cũ. Chỉ là một câu hỏi khác gây tò mò hơn bất cứ điều gì khác, liệu có phải là cách duy nhất để mở fifo cho r / w trong một bước không? Và có cách nào khác để buộc vỏ phải rẽ nhánh như trong # 1 không? Cảm ơn bạn!
foo


1
Shell sẽ rẽ nhánh bất cứ khi nào bạn sử dụng đường ống, vỏ con hoặc thay thế quá trình.
Mikel

2
Sửa lỗi, bạn sẽ cần nc ... <>fifo >&0, vì <>fifomở fifođể đọc và viết trên fd 0, và chúng tôi cũng muốn đầu ra ở đó.
Mikel
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.