我有一堆文件描述符的列表,我創建了kevents,我試圖弄清楚是否有任何方法可以獲取準備讀取或寫入訪問的數量。有什麼辦法可以用kqueue/kevent模擬epoll_wait嗎?
有什麼辦法可以得到「ready」文件描述符的列表,比如epoll_wait提供了什麼?
我有一堆文件描述符的列表,我創建了kevents,我試圖弄清楚是否有任何方法可以獲取準備讀取或寫入訪問的數量。有什麼辦法可以用kqueue/kevent模擬epoll_wait嗎?
有什麼辦法可以得到「ready」文件描述符的列表,比如epoll_wait提供了什麼?
發生的事件放入傳遞給kevent
調用的eventlist
緩衝區中。因此,使這個緩衝區足夠大,會給你你正在尋找的名單。 kevent
調用的返回 值會告訴您有很多事件 都在eventlist
緩衝區中。
如果使用大緩衝區不是出於某種原因可行, 你總是可以做一個循環中調用kevent
與零超時 和較小的緩衝區,直到你得到的EVENTLIST零個事件。
爲了讓多一點背景...
一個預期的情況與KEVENT()是你將線程池調用它。如果你有3個線程池都要求4個事件,操作系統希望能夠按照它認爲合適的方式彙集和分配實際事件。
如果有7個事件可用,操作系統可能想要分派到3個線程,或者如果它認爲它有空的內核和較少的開銷,它可能想分派到所有3個線程。
我並不是說你的方案根本無效;只是該系統或多或少的設計使信息遠離你,所以它沒有涉及說'好吧,12個描述符已準備就緒。哦,呃,我剛剛告訴過你,但其中有三個在你有機會做任何事情之前就已經浮出水面了。
Grrr幾乎釘住了這個場景。您可以註冊/取消註冊一次描述符,並在事件觸發時將相關描述符返回給您。
雖然我不需要在kevent調用中傳遞文件描述符嗎?我想我需要更多地玩這個。 – clee 2010-09-27 17:55:36
您可以使用'kevent'調用來註冊您對某種事件的興趣,以及檢索實際發生的事件。你可以在一次通話中將它結合起來,但你不需要。一旦你註冊了你對文件描述符的興趣,'kevent'將報告這個描述符的相關事件,除非你使用了'EV_ONESHOT',或者刪除了事件,或者關閉了描述符。 – Grrrr 2010-09-27 21:32:29