2010-01-31 65 views
9

How do you use AIO and epoll together in a single event loop?的討論後。重溫「如何一起使用aio和epoll」

在Linux中實際上有2個「aio」API。 有一個POSIX aio(aio_ *系列函數),包含在我認爲由RedHat(?)開發的glibc和libaio中,即io_ *系列。

第一個允許通過aio_sigevent aiocb成員註冊通知請求。這可以很容易地與ppoll()/ pselect()事件循環集成。如果你想把POSIX aio與epoll()集成在一起,那麼你需要將信號轉換成一個虛擬fd(一個管道)的事件,然後用epoll監聽它,同時以經典的方式或ppoll /選擇。第一選擇(普通簽名人)的安全程度取決於應用程序。也許在epoll上,但我沒有完全意識到它的內部。我可以安全地假設,如果我有一個基於epoll的應用程序,並且我想添加POSIX aio支持,那我就搞定了?這是我的問題。

第二個AIO實現libaio - 事實上可以用於eventfd()(結構iocb具有aio_resfd成員,預計爲零或eventfd將AIO結果傳遞給)。但這不是書中的內容。 POSIX指定的,也就是說。

我夢想自己是一個* BSD用戶,一切都很清晰。你有POSIX AIO和kqueue()支持AIO事件。晶瑩剔透。像許多其他事情一樣。

回答

6

請注意,您可以在epoll中使用POSIX aio,這裏有signalfd(2)它創建了一個文件描述符,然後您可以使用它來在基於epoll的循環中通知信號。

而且第二AIO API應該最終是什麼glibc的基地是實現POSIX AIO的,它只是還沒有應用...(我不知道是否有人正在研究它要麼)

+0

你可以舉一個例子,使用'signalfd(2)'結合POSIX aio和'epoll'('select','poll'),因爲結構'siginfo_t'具有成員'si_value',而結構'signalfd_siginfo'通過閱讀'signalfd'返回沒有相應的成員'ssi_value',我怎麼能通過讀取'signalfd'完成一個posix aio時返回的'si_value'? – toolchainX 2013-09-11 09:24:12

+0

@toolchainX不,對不起,我從來沒有親自做過 – Spudd86 2013-09-25 00:46:26