2010-01-31 23 views
9

theo dõi cuộc thảo luận tại How do you use AIO and epoll together in a single event loop?.xem lại "cách bạn sử dụng aio và epoll cùng nhau"

Có 2 API "aio" trong linux. Có POSIO aio (gia đình aio_ * chức năng), bao gồm trong glibc và libaio được phát triển Tôi tin rằng bởi RedHat (?), Gia đình io_ *.

Người đầu tiên cho phép đăng ký yêu cầu thông báo qua thành viên aiib aio_sigevent. Điều đó có thể dễ dàng được tích hợp với các vòng sự kiện ppoll()/pselect(). Nếu bạn muốn tích hợp POSIX aio với epoll() thì bạn cần dịch tín hiệu thành sự kiện trên fd giả (một ống có thể) và nghe nó với epoll, trong khi bắt tín hiệu theo cách cổ điển hoặc với ppoll/lựa chọn. Làm thế nào an toàn là sự lựa chọn đầu tiên (thở dài bình thường), phụ thuộc vào ứng dụng. Và có lẽ trên epoll nhưng tôi không nhận thức đầy đủ về ruột của nó. Tôi có thể giả định một cách an toàn rằng nếu tôi có một ứng dụng dựa trên epoll và tôi muốn thêm hỗ trợ aio POSIX sau đó tôi đang hơi say? Đây là câu hỏi của tôi.

Triển khai AIO thứ hai, libaio - có thể được sử dụng thực sự với eventfd() (struct iocb có thành viên aio_resfd được dự kiến ​​là 0 hoặc eventfd để phân phối kết quả AIO). Nhưng nó không phải bởi cuốn sách. POSIX quy định, đó là.

Tôi mơ ước mình là một người dùng * BSD nơi mọi thứ đều rõ ràng. Bạn có hỗ trợ POSIX AIO và kqueue() cho các sự kiện AIO. Tinh thể rõ ràng. Giống như nhiều thứ khác.

Trả lời

6

lưu ý bạn CÓ THỂ sử dụng POSIX aio với epoll, có signalfd(2) nó tạo bộ mô tả tệp mà bạn có thể sử dụng để được thông báo về tín hiệu trong vòng lặp dựa trên epoll.

Ngoài ra aio API thứ hai được cho là cuối cùng là những gì căn cứ glibc nó thi hành POSIX aio trên, nó chỉ là không hoàn toàn có được nêu ra ... (Tôi không biết nếu có ai đang làm việc trên nó trong hai)

+0

bạn có thể đưa ra một ví dụ để sử dụng 'signalfd (2)' kết hợp với POSIX aio và 'epoll' (' select', 'poll'), vì struct' siginfo_t' có thành viên 'si_value' trong khi struct' signalfd_siginfo' trả về bằng cách đọc 'signalfd' không có thành viên tương ứng' ssi_value', làm cách nào tôi có thể nhận 'si_value' được trả về khi aio posix hoàn thành bằng cách đọc' signalfd'? – toolchainX

+0

@toolchainX không, xin lỗi, tôi chưa bao giờ thực sự tự làm – Spudd86

Các vấn đề liên quan