Đảm bảo cho ghi đồng thời vào một ống có tên là gì?


32

Ví dụ, tôi đã tạo một đường ống có tên như sau:

mknod myPipe p

Và tôi đọc từ nó từ một số quá trình (ví dụ, một số máy chủ). Ví dụ mục đích, tôi đã sử dụng đuôi:

tail -f myPipe

Nếu một số quy trình khách hàng viết một số tin nhắn vào nó (ví dụ, echo "msg" >> myPipecó khả năng các tin nhắn sẽ được xen kẽ, như thế này:

 <beginning of message1><message2><ending of message1>

Hoặc là quá trình viết để đặt tên ống là nguyên tử?

Câu trả lời:


29

Nó phụ thuộc vào mức độ mỗi quy trình được viết (giả sử hệ điều hành của bạn tuân thủ POSIX trong vấn đề này). Từ write():

Viết yêu cầu cho một đường ống hoặc FIFO sẽ được xử lý theo cách tương tự như một tệp thông thường với các ngoại lệ sau:
[...]

  • Yêu cầu ghi từ {PIPE_BUF} byte trở xuống sẽ không được xen kẽ với dữ liệu từ các quy trình khác đang thực hiện ghi trên cùng một đường ống. Các ghi có lớn hơn {PIPE_BUF} byte có thể có dữ liệu xen kẽ, trên các ranh giới tùy ý, với các quá trình ghi khác, cho dù cờ O_NONBLOCK của cờ trạng thái tệp có được đặt hay không.

Cũng trong Lý do phần liên quan đến đường ống và FIFOs:

  • Nguyên tử / không nguyên tử : Một ghi là nguyên tử nếu toàn bộ số tiền được ghi trong một thao tác không được xen kẽ với dữ liệu từ bất kỳ quá trình nào khác. Điều này hữu ích khi có nhiều nhà văn gửi dữ liệu đến một người đọc. Các ứng dụng cần phải biết mức độ lớn của một yêu cầu ghi có thể được thực hiện nguyên tử. Mức tối đa này được gọi là {PIPE_BUF}. Tập POSIX.1-2008 này không cho biết việc ghi yêu cầu nhiều hơn {PIPE_BUF} byte là nguyên tử, nhưng yêu cầu ghi {PIPE_BUF} hoặc ít byte hơn sẽ là nguyên tử.

Giá trị nếu PIPE_BUFđược xác định bởi mỗi lần thực hiện, nhưng tối thiểu là 512 byte (xem limits.h). Trên Linux, nó là 4096 byte (xem pipe(7)).


5
Nhân tiện, PIPE_BUF được đảm bảo ít nhất là 512. Lưu ý rằng bạn cũng phải đảm bảo rằng quy trình của bạn thực sự ghi từng dòng vào nó trong một cuộc gọi viết. Kích hoạt bộ đệm dòng ( setvbuf(stdout, NULL, _IOLBF,512)) sẽ thực hiện việc này mà không yêu cầu bạn sử dụng các hàm cấp thấp.
Random832

Đây là bảng các PIPE_BUFgiá trị quan sát được trên các hệ thống Unix phổ biến: ar.to/notes/poseix#pipe-buf
Arto Bendiken

Tôi không hiểu làm thế nào các ổ cắm có thể được ghép kênh ... nhưng các ống được đặt tên không thể ?? tất cả mọi thứ trên unix chỉ là một tập tin phải không? lulz
Alexander Mills

@AlexanderMills: Tôi không hiểu nhận xét của bạn
Mat

1
@AlexanderMills: không, đó là giá trị tối thiểu
Mat
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.