(PECL ev >= 0.2.0)
Ev 是一個靜態類別,提供對預設迴圈和一些常用操作的存取。
傳遞給建立迴圈的旗標
Ev::FLAG_AUTO
預設的旗標值
Ev::FLAG_NOENV
如果使用此旗標(或程式以 setuid 或 setgid 方式執行),libev
將不會查看環境變數 LIBEV_FLAGS。否則(預設情況下),如果找到 LIBEV_FLAGS,它將完全覆蓋旗標。對於效能測試和搜尋錯誤很有用。
Ev::FLAG_FORKCHECK
使 libev 在每次迭代中檢查 fork,而不是手動呼叫 EvLoop::fork()。這會透過在迴圈的每次迭代中呼叫 getpid()
來運作,因此這可能會在迴圈迭代次數很多時減慢事件迴圈的速度,但通常不會被注意到。此旗標設定無法在 LIBEV_FLAGS 環境變數中覆蓋或指定。
Ev::FLAG_NOINOTIFY
當指定此旗標時,libev
將不會嘗試對其 » ev_stat 監視器使用 inotify
API。此旗標對於保留 inotify 檔案描述器很有用,因為否則每個使用 ev_stat
監視器的迴圈都會消耗一個 inotify
控制代碼。
Ev::FLAG_SIGNALFD
當指定此旗標時,libev
將嘗試對其 » ev_signal (和 » ev_child ) 監視器使用 signalfd
API。此 API 同步傳遞訊號,這使其速度更快,並可能取得佇列的訊號資料。它還可以簡化使用執行緒的訊號處理,只要訊號在執行緒中被正確地封鎖。Signalfd
預設不會使用。
Ev::FLAG_NOSIGMASK
當指定此旗標時,libev
將避免修改訊號遮罩。具體來說,這表示必須確保在接收訊號之前解除封鎖訊號。
此行為對於自訂訊號處理或僅在特定執行緒中處理訊號很有用。
傳遞給 Ev::run() 或 EvLoop::run() 的旗標
Ev::RUN_NOWAIT
表示事件迴圈將尋找新的事件,將處理這些事件和任何已未處理的事件,但如果沒有事件,則不會等待並封鎖進程,並在迴圈的一次迭代後返回。這有時在進行長時間計算時對於輪詢和處理新事件很有用,以保持程式的響應能力。
Ev::RUN_ONCE
表示事件迴圈將尋找新的事件(如有必要,會等待),並將處理這些事件和任何已未處理的事件。它將封鎖進程,直到至少有一個新事件到達(這可能是 libev 本身內部的事件,因此無法保證將呼叫使用者註冊的回呼),並在迴圈的一次迭代後返回。
傳遞給 Ev::stop() 或 EvLoop::stop() 的旗標
Ev::BREAK_CANCEL
取消中斷操作。
Ev::BREAK_ONE
使最內層的 Ev::run()(或 EvLoop::run())呼叫返回。
Ev::BREAK_ALL
使所有巢狀的 Ev::run()(或 EvLoop::run())呼叫返回。
監視器優先順序
Ev::MINPRI
允許的最小監視器優先順序。
Ev::MAXPRI
允許的最大監視器優先順序。
(已接收)事件的位元遮罩
Ev::READ
EvIo 監視器中的檔案描述器已變成可讀取。
Ev::WRITE
EvIo 監視器中的檔案描述器已變成可寫入。
Ev::TIMER
EvTimer 監視器已逾時。
Ev::PERIODIC
EvPeriodic 監視器已逾時。
Ev::SIGNAL
已收到 EvSignal::__construct() 中指定的訊號。
Ev::CHILD
EvChild::__construct() 中指定的 pid
已接收到狀態變更。
Ev::STAT
EvStat 監視器中指定的路徑已變更其屬性。
Ev::IDLE
當沒有其他監視器要執行時,EvIdle 監視器會運作。
Ev::PREPARE
在 Ev::run() 開始之前,會先呼叫所有 EvPrepare 監視器。因此,EvPrepare 監視器是在事件迴圈睡眠或輪詢新事件之前最後呼叫的監視器。
Ev::CHECK
在 Ev::run() 收集新事件之後,但在為任何接收到的事件將任何回呼排入佇列之前,會立即將所有 EvCheck 監視器排入佇列。因此,EvCheck 監視器將在事件迴圈迭代中的任何相同或較低優先順序的其他監視器之前呼叫。
Ev::EMBED
EvEmbed 監視器中指定的嵌入式事件迴圈需要注意。
Ev::CUSTOM
libev
本身永遠不會傳送(或以其他方式使用),但 libev
使用者可以自由使用它來發出監視器訊號(例如,透過 EvWatcher::feed())。
Ev::ERROR
發生未指定的錯誤,監視器已停止。這可能是因為監視器無法正確啟動,因為 libev
記憶體不足,發現檔案描述器已關閉或任何其他問題。Libev
認為這些是應用程式錯誤。另請參閱 » 監視器內容的結構
後端旗標
Ev::BACKEND_SELECT
select(2) 後端
Ev::BACKEND_POLL
poll(2) 後端
Ev::BACKEND_EPOLL
Linux 特定的 epoll(7)
後端,適用於 2.6.9 前後的核心
Ev::BACKEND_KQUEUE
在大多數 BSD 系統上使用的 kqueue
後端。EvEmbed 監視器可用於將一個迴圈(具有 kqueue 後端)嵌入到另一個迴圈中。例如,可以嘗試建立一個具有 kqueue
後端的事件迴圈,並僅將其用於 socket。
Ev::BACKEND_DEVPOLL
Solaris 8 後端。這尚未實作。
Ev::BACKEND_PORT
Solaris 10 事件埠機制,具有良好的擴充性。
Ev::BACKEND_ALL
嘗試所有後端(即使是損壞的)。不建議明確使用它。此處應應用位元運算子(例如,Ev::BACKEND_ALL
& ~ Ev::BACKEND_KQUEUE
)。請使用 Ev::recommendedBackends(),或者完全不指定任何後端。
Ev::BACKEND_MASK
不是後端,而是從 flags
值中選取所有後端位元的遮罩,以遮罩任何後端(例如,在修改 LIBEV_FLAGS 環境變數時)。
注意:
對於模組初始化階段的預設迴圈,
Ev
透過pthread_atfork
(如果可用) 註冊 » ev_loop_fork 呼叫。
注意:
有方法可在 Ev 類別中存取預設事件迴圈(例如 Ev::iteration()、Ev::depth() 等)。對於自訂迴圈(使用 EvLoop::__construct() 建立),這些值可透過 EvLoop 類別的對應屬性和方法存取。
預設事件迴圈的實例本身可透過 EvLoop::defaultLoop() 方法擷取。