Tôi đã đọc về cách các đường ống được triển khai trong nhân Linux và muốn xác thực sự hiểu biết của tôi. Nếu tôi không chính xác, câu trả lời với lời giải thích chính xác sẽ được chọn.
- Linux có một VFS gọi là pipefs được gắn trong kernel (không phải trong không gian người dùng)
- Pipefs có một siêu khối duy nhất và được gắn tại gốc của nó (
pipe:
), cùng với/
- Pipefs không thể được xem trực tiếp không giống như hầu hết các hệ thống tập tin
- Mục để pipefs là thông qua các
pipe(2)
syscall - Tòa nhà
pipe(2)
được sử dụng bởi các trình bao cho đường ống với|
toán tử (hoặc thủ công từ bất kỳ quy trình nào khác) tạo ra một tệp mới trong các ống dẫn hoạt động khá giống với một tệp bình thường - Tệp ở phía bên trái của toán tử đường ống đã được
stdout
chuyển hướng đến tệp tạm thời được tạo trong pipefs - Tệp ở phía bên phải của toán tử đường ống
stdin
được đặt thành tệp trên đường ống - Pipefs được lưu trữ trong bộ nhớ và thông qua một số phép thuật hạt nhân, không nên phân trang
Là giải thích về cách ống (ví dụ ls -la | less
) hoạt động khá chính xác?
Một điều tôi không hiểu là làm thế nào một cái gì đó như bash sẽ thiết lập một quy trình ' stdin
hoặc stdout
cho bộ mô tả tệp được trả về pipe(2)
. Tôi chưa thể tìm thấy bất cứ điều gì về điều đó.
Vâng, tôi đặc biệt đề cập đến các hoạt động cấp thấp hơn, với giả định rằng
—
Brandon Wamboldt
|
nhà điều hành chỉ gọi pipe(2)
như là một quá trình như bash.
pipe()
gọi kernel cùng với máy móc hỗ trợ nó (pipefs
, v.v.) ở mức thấp hơn nhiều so với|
toán tử được cung cấp trong trình bao của bạn. Cái sau thường được thực hiện bằng cái trước, nhưng nó không phải như vậy.