Câu trả lời:
Các đường ống được liên kết đơn giản với các mô tả tệp khác nhau hơn 0 (stdin):
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
Một quá trình tất nhiên có thể có nhiều hơn một mô tả tệp mở cùng một lúc, vì vậy không có vấn đề gì.
pipe()
cuộc gọi hệ thống.
pipe()
và sau đó tạo ra các quy trình con. Quá trình chính không có thêm file descriptor mở nếu một ống nặc danh được sử dụng. Các mô tả tệp bổ sung này được thông qua trong biểu mẫu /dev/fd/...
và quy trình thường sẽ chỉ đơn giản là mở chúng bằng các tên tệp này. Điều này sẽ dẫn đến việc chúng được chỉnh sửa dup()
, tạo ra các mô tả tệp mở hơn nữa. Quá trình cũng có thể sử dụng bộ mô tả tệp được đặt tên ngay lập tức mà không cần bất kỳ cuộc gọi mở nào ...
a
, tôi gọi nó là ./a <(ls)
và nó đã in thành công danh sách các tệp, chứng minh bộ giải mã tệp có tên (63 trong trường hợp của tôi) đã được mở. Bash có thể sử dụng các ống có tên trong một thư mục tạm thời trên các kiến trúc khác với Linux, trong trường hợp đó, không có mô tả tệp bổ sung nào sẽ được mở khi vào quy trình chính.
bash
trang người đàn ông.