Tại sao không chuyển hướng tệp đến và từ một công việc đường ống được đặt tên, nhưng đường ống đến mèo thì không?


8

Đây là một máy chủ echo đơn giản trong Unix, sử dụng nc:

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(dựa trên điều này )

Như tôi có thể thấy, luồng dữ liệu hoạt động như sau:

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

Và đây là câu hỏi: tại sao điều này không hoạt động?

nc -k -l 4458 -v >fifo <fifo

Bạn sẽ nhận thấy rằng nếu bạn cố gắng telnetđể localhosttrên 4458bạn sẽ nhận được một kết nối "từ chối" lỗi.


Tôi không có câu trả lời nhưng hy vọng điều này có thể giúp một người hiểu biết hơn tôi. cat myfifo | nc -k -l 4458 > myfifocũng hoạt động. Nếu bạn sử dụng tệp văn bản, file.txt như vậy nc -k -l 4458 < file.txt > file.txtKết nối đầu tiên sẽ kết nối và đóng (có nghĩa là vì đầu vào bị cắt và EOF đóng ổ cắm), kết nối thứ hai sẽ trở thành một máy chủ tiếng vang đáng quên: nó sẽ lặp lại mọi dòng khác và lưu các dòng chưa được lưu vào tệp văn bản.
dùng1794469

Câu trả lời:


9

Điều này là do lệnh netcat thậm chí chưa bắt đầu! Shell khi cố gắng mở fifo cho đầu vào sẽ chặn. Thử

strace cat >fifo <fifo

và bạn sẽ không thấy gì. Thay vì sử dụng, ví dụ,

nc -k -l 4458 -v <>fifo >&0

trong đó mở fifo để đọc và viết dưới dạng stdin, và sau đó chuyển nó sang thiết bị xuất chuẩn.


Theo dõi lệnh bash đầy đủ cho thấy rằng không phải mở trả về đọc và ghi (cho đến khi mở ngược lại được thực hiện):

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo: Mở một FIFO để đọc các khối thông thường cho đến khi một quá trình khác mở cùng một FIFO để viết và ngược lại.


1
Ngăn chặn được ghi chép lại: tldp.org/LDP/lpg/node19.html
thrig

Tại sao khối vỏ khi sử dụng "> fifo <fifo"? Dường như nó mở ra để viết và sau đó để đọc. Vì vậy, vì đã có một tay cầm để viết nên nó không tiếp tục bình thường?
Razvan

@Razvan Tôi đã cập nhật câu trả lời với bước thực tế cho hai lệnh mở thay thế của fifo và bạn có thể thấy rằng mở để viết hoặc đọc cả hai khối.
meuh
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.