Những lợi thế của việc sử dụng đường ống được đặt tên so với đường ống không tên là gì?


51

Tôi đã xem xét một loạt các câu hỏi phỏng vấn được hỏi từ một quản trị viên unix; Tôi tìm thấy một chủ đề gọi là "ống tên".

Tôi googled chủ đề; đến một mức độ nào đó tôi đã có thể hiểu nó: - được đặt tên là ống | | VÒI

Nhưng tôi vẫn cảm thấy rằng tôi thiếu kiến ​​thức khi nào nên sử dụng loại ống đặc biệt này. Có bất kỳ tình huống đặc biệt nào mà các đường ống không tên sẽ không hoạt động?


Một liên kết khác trên diễn đàn kỹ thuật: writeulearn.com/c Ab / inter- process

Câu trả lời:


39

Các ống được đặt tên (fifo) có bốn ba lợi thế tôi có thể nghĩ đến:

  • bạn không phải bắt đầu quá trình đọc / viết cùng một lúc
  • bạn có thể có nhiều độc giả / nhà văn không cần tổ tiên chung
  • dưới dạng tệp bạn có thể kiểm soát quyền sở hữu và quyền
  • chúng là hai chiều, ống không tên có thể là đơn hướng *

    *) Hãy nghĩ về một vỏ tiêu chuẩn |đường ống đó là một chiều, một số vỏ ( ksh, zshbash) cũng cung cấp coprocesses cho phép giao tiếp hai chiều. POSIX coi các đường ống là một nửa song công (tức là mỗi bên chỉ có thể đọc hoặc ghi), pipe()cuộc gọi hệ thống trả về hai tay cầm tệp và bạn có thể được yêu cầu coi một bên là chỉ đọc và bên kia là chỉ đọc. Một số hệ thống (BSD) hỗ trợ đọc và ghi đồng thời (không bị cấm bởi POSIX), trên các hệ thống khác, bạn sẽ cần hai ống dẫn, mỗi ống cho mỗi hướng. Kiểm tra trang của bạn pipe(), popen()và có thể là popen2()người đàn ông. Tính không định hướng có thể không phụ thuộc vào việc đường ống có được đặt tên hay không, mặc dù trên Linux 2.6 nó phụ thuộc.

(Được cập nhật, nhờ phản hồi từ Stephane Chazelas )

Vì vậy, một nhiệm vụ rõ ràng ngay lập tức bạn không thể đạt được với một ống không tên là một ứng dụng máy khách / máy chủ thông thường.

Điểm cuối cùng (bị ảnh hưởng) ở trên về các đường ống một chiều có liên quan trên Linux, POSIX (xem popen()) nói rằng một đường ống chỉ cần có thể đọc hoặc ghi được , trên Linux chúng là một hướng . Xem Hiểu Hạt nhân Linux (Ed 3 O'Reilly) để biết chi tiết cụ thể về Linux (tr787). Các hệ thống khác cung cấp các ống dẫn hai chiều (chưa được đặt tên).

Ví dụ, Nagios sử dụng fifo cho tệp lệnh của nó . Các quy trình bên ngoài khác nhau (tập lệnh CGI, kiểm tra bên ngoài, NRPE, v.v.) viết các lệnh / cập nhật cho fifo này và các quy trình này được xử lý bởi quy trình Nagios liên tục.

Các ống được đặt tên có các tính năng không giống như các kết nối TCP, nhưng có những khác biệt quan trọng. Bởi vì fifo có tên hệ thống tập tin liên tục, bạn có thể ghi vào nó ngay cả khi không có người đọc, phải thừa nhận rằng ghi sẽ chặn (không có I / O không đồng bộ hoặc không chặn), mặc dù bạn sẽ không mất dữ liệu nếu người nhận không đã bắt đầu (hoặc đang được khởi động lại).

Để tham khảo, xem thêm các ổ cắm tên miền Unix và câu trả lời cho câu hỏi Stackoverflow này tóm tắt các phương thức IPC chính và câu hỏi này nói vềpopen()


2
bạn có thể có nhiều độc giả / nhà văn với các ống không tên là tốt. Trên Linux, chúng không có nhiều hướng hơn so với đường ống chưa được đặt tên. Có một kết thúc bằng văn bản và một kết thúc đọc và dữ liệu chỉ chảy theo một hướng. Khi bạn mở fifo ở chế độ ghi, bạn sẽ nhận được kết thúc viết, ở chế độ đọc kết thúc đọc, ở chế độ rw, bạn viết vào cuối viết và đọc từ đọc. Điều đó khác với các đường ống hai chiều hoặc ổ cắm miền unix, nơi bạn thực sự có hai luồng dữ liệu riêng biệt theo mỗi hướng.
Stéphane Chazelas

@StephaneChazelas cảm ơn bạn đã phản hồi, tôi đã cập nhật câu trả lời để cụ thể hơn, và làm rõ (tôi hy vọng) các đường ống và hướng.
mr.spuratic

Có giao tiếp với một ống có tên liên quan đến IO đĩa? Hay là tất cả trong bộ nhớ? Điều gì quyết định phong bì hiệu suất của các cơ chế IPC này?
CMCDragonkai

15

Các đường ống không tên hoặc ẩn danh cung cấp một phương tiện giao tiếp giữa một chiều, một chiều giữa các quá trình khác nhau có liên quan bởi mối quan hệ cha-con hoặc là con của cha mẹ chung cung cấp đường ống, chẳng hạn như vỏ quá trình. Bởi vì các quy trình có liên quan, việc liên kết các mô tả tệp với đường ống có thể được ẩn và không yêu cầu một đối tượng có tên bên ngoài các quy trình. Một ống không tên chỉ tồn tại miễn là quá trình sử dụng nó duy trì các mô tả tệp mở cho đường ống. Khi các tiến trình thoát và HĐH đóng tất cả các mô tả tệp được liên kết với các tiến trình, đường ống không tên được đóng lại.

Các ống được đặt tên trên thực tế là của FIFO. Đây là những đối tượng liên tục được đại diện bởi các nút trong hệ thống tệp. Một đường ống có tên cung cấp giao tiếp nhiều-nhiều, hai chiều giữa một hoặc nhiều quá trình không nhất thiết liên quan và không cần tồn tại cùng một lúc. Tên tệp của đường ống đóng vai trò là địa chỉ hoặc hợp đồng giữa các quy trình để liên lạc. Nếu chỉ có một quy trình ghi vào một đường ống có tên và một quá trình khác đọc từ đường ống được đặt tên, thì đường ống có tên đó sẽ hoạt động giống như một đường ống không tên giữa hai quá trình liên quan.

Vì vậy, câu trả lời ngắn gọn là bạn cần một đường ống có tên để liên lạc giữa các quá trình không liên quan có thể không tồn tại cùng một lúc.


+1 Tôi nghĩ rằng các quy trình gần như luôn tồn tại cùng một lúc (nếu không thì đường ống hơi vô nghĩa - bạn cũng có thể để lại các thứ trong một tệp thông thường). Các ổ cắm miền và unix này thường được sử dụng bởi các dịch vụ daemon có thể được kiểm soát, ví dụ, từ dòng lệnh. Nếu bạn nhìn /runvào một hệ thống máy tính để bàn linux, có lẽ bạn sẽ tìm thấy một vài trong số cả hai (được đặt tên là fifos và unix socket). Đó là một dạng của IPC .
goldilocks

2
@goldilocks: Một ống có tên thường được sử dụng làm hộp thư quảng cáo thường trú trong bộ nhớ giữa các quy trình trong các hệ thống nhúng, trong đó các quy trình giao tiếp tồn tại trong thời gian ngắn và không tồn tại cùng một lúc. Ưu điểm là sự đơn giản của việc triển khai so với IPC bộ nhớ dùng chung và thực tế là chỉ sử dụng RAM. Nhược điểm là sự không bền bỉ giữa khởi động và tính chất FIFO khôn ngoan của đường ống so với khả năng sử dụng cấu trúc với bộ nhớ dùng chung.
Jonathan Ben-Avraham

@jonathan: +1, tôi có một số nghi ngờ: - tại sao chúng ta gọi các ống được đặt tên là FIFO; đối tượng bền bỉ là gì?
Ankit

@Ankit: Một số người gọi một ống có tên là FIFO vì nó hoạt động giống như cấu trúc dữ liệu của FIFO, đặc biệt là khi được mở cho cả đọc và viết bởi một quy trình duy nhất. Bởi "đối tượng liên tục" Tôi có nghĩa là một ống có tên được liên kết với một đối tượng hệ thống tệp. Đó là, nó là một loại tệp, có tên và nó có cùng tính bền vững như bất kỳ tệp nào khác được lưu trữ trên phương tiện truyền thông.
Jonathan Ben-Avraham

4

Một lợi thế không được đề cập ở nơi khác là một đường ống có tên có thể được sử dụng ở những nơi chỉ có một tệp sẽ làm.

Ví dụ: một số ứng dụng email có tính năng nối thêm nội dung của ~ / .signature vào mỗi thư. Nếu .signature là một tùy chọn dòng lệnh hoặc nếu ứng dụng thư khách có thể nhận thấy rằng .ignign có thể thực thi được và chạy nó, thì bạn sẽ không cần một đường dẫn có tên. Nhưng nếu ứng dụng thư khách không phức tạp như vậy, bạn có thể tạo một đường ống có tên là .signature và chạy một ứng dụng tạo chữ ký mới mỗi khi tệp được đọc.


Hấp dẫn. Bạn có một ứng dụng như vậy? Có vẻ như nó sẽ phải xem ở cấp độ kernel để biết khi nào thì FIFO được truy cập.
tự đại diện

4

Có một lợi thế khác của các đường ống được đặt tên: bạn có thể sử dụng chúng trên các hệ thống khác nhau . Giả sử bạn muốn giao tiếp thời gian thực của hai quá trình chạy trên các máy khác nhau. Sau đó chia sẻ một thư mục giữa hai người, đặt FIFO của bạn vào thư mục và tắt đi. Nó dễ dàng hơn đáng kể so với việc chuyển đổi một ứng dụng được thiết kế để hoạt động trên các tệp thành dịch vụ nghe trên cổng.

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.