Đường ống đệm (được đặt tên) trong GNU OS


9

Trong HĐH GNU, một quy trình chỉ có thể ghi dữ liệu vào một đường ống nếu một quá trình khác đọc cùng một dữ liệu (từ cùng một đường ống) cùng một lúc.

Có một cái gì đó giống như một đường ống cho phép quá trình thứ nhất ghi và đệm dữ liệu cho đến khi thứ 2 đọc nó?

Câu trả lời:


5

Một ống có tên (fifo) có thể làm những gì bạn muốn đến một điểm, nhưng với một vài cảnh báo:

  1. Nếu bạn muốn có thể ghi vào đường ống trước khi người đọc tồn tại, nhà văn của bạn phải mở fifo dưới dạng đọc-ghi hoặc lệnh gọi opensẽ chặn. Trong cái vỏ này có thể trông như thế này:

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    

    Như bạn có thể thấy ở đó, tôi có thể viết vào đường ống trước khi người đọc ở xung quanh. Khi tôi đọc từ đường ống, các tin nhắn tôi đã viết đã ở đó.

  2. Ghi vào đường ống cuối cùng sẽ chặn một khi đường ống đầy. Theo ống (7) trên linux:

Một đường ống có công suất hạn chế. Nếu đường ống đầy, thì ghi (2) sẽ chặn hoặc thất bại, tùy thuộc vào việc cờ O_NONBLOCK có được đặt hay không (xem bên dưới). Việc thực hiện khác nhau có giới hạn khác nhau cho công suất đường ống. Các ứng dụng không nên dựa vào một năng lực cụ thể: một ứng dụng nên được thiết kế sao cho quá trình đọc sẽ tiêu thụ dữ liệu ngay khi có sẵn, để quá trình viết không bị chặn.

Trong các phiên bản Linux trước 2.6.11, dung lượng của một đường ống giống như kích thước trang hệ thống (ví dụ: 4096 byte trên i386). Kể từ Linux 2.6.11, dung lượng đường ống là 65536 byte.

Tùy thuộc vào trường hợp sử dụng của bạn, bạn cũng có thể xem xét sử dụng hàng đợi tin nhắn. Nhân cung cấp một hàng đợi tin nhắn. Trên Linux, xem mq_overview (7) để biết tổng quan tốt. Ngoài ra, các dịch vụ như RabbitMQ cung cấp hàng đợi tin nhắn với nhiều bộ tính năng bao gồm có thể sử dụng được trên một mạng.


Tôi muốn xác định công suất trong thời gian chạy.
Al Klimov

@AlKlimov Dường như bạn có thể đặt dung lượng của đường ống bằng cách sử dụng f_SETPIPE_SZ fcntl. Xem man7.org/linux/man-pages/man2/fcntl.2.html để biết thêm thông tin.
Steven D

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.