Về câu hỏi về hiệu suất của bạn, các đường ống hiệu quả hơn các tệp vì không cần IO đĩa. Vì vậy, cmd1 | cmd2
hiệu quả hơn cmd1 > tmpfile; cmd2 < tmpfile
(điều này có thể không đúng nếu tmpfile
được hỗ trợ trên đĩa RAM hoặc thiết bị bộ nhớ khác như ống có tên; nhưng nếu đó là ống có tên, cmd1
thì nên chạy trong nền vì đầu ra của nó có thể chặn nếu đường ống đầy ). Nếu bạn cần kết quả cmd1
và vẫn cần gửi đầu ra của nó tới cmd2
, bạn cmd1 | tee tmpfile | cmd2
sẽ cho phép cmd1
và cmd2
chạy song song tránh các hoạt động đọc đĩa từ đó cmd2
.
Các ống được đặt tên là hữu ích nếu nhiều quá trình đọc / ghi vào cùng một ống. Chúng cũng có thể hữu ích khi một chương trình không được thiết kế để sử dụng stdin / stdout cho IO cần sử dụng tệp . Tôi đặt các tệp in nghiêng vì các ống có tên không phải là các tệp chính xác theo quan điểm lưu trữ vì chúng nằm trong bộ nhớ và có kích thước bộ đệm cố định, ngay cả khi chúng có mục hệ thống tệp (cho mục đích tham khảo). Những thứ khác trong UNIX có các mục hệ thống tệp mà không phải là tệp: chỉ cần nghĩ đến /dev/null
hoặc các mục khác trong /dev
hoặc /proc
.
Vì các đường ống (được đặt tên và không được đặt tên) có kích thước bộ đệm cố định, các hoạt động đọc / ghi đối với chúng có thể chặn, khiến quá trình đọc / ghi diễn ra ở trạng thái IOWait. Ngoài ra, khi nào bạn nhận được EOF khi đọc từ bộ nhớ đệm? Các quy tắc về hành vi này được xác định rõ và có thể được tìm thấy ở người đàn ông.
Một điều bạn không thể làm với các đường ống (được đặt tên và không được đặt tên) là tìm kiếm lại dữ liệu. Khi chúng được thực hiện bằng cách sử dụng bộ nhớ đệm, điều này là dễ hiểu.
Về "everything in Linux/Unix is a file"
, tôi không đồng ý. Các ống được đặt tên có các mục hệ thống tập tin, nhưng không chính xác tập tin. Các ống không tên không có các mục hệ thống tập tin (ngoại trừ có thể trong /proc
). Tuy nhiên, hầu hết các hoạt động IO trên UNIX đều được thực hiện bằng cách sử dụng chức năng đọc / ghi cần một bộ mô tả tệp , bao gồm cả đường ống không tên (và ổ cắm). Tôi không nghĩ rằng chúng ta có thể nói điều đó "everything in Linux/Unix is a file"
, nhưng chúng ta chắc chắn có thể nói điều đó "most IO in Linux/Unix is done using a file descriptor"
.