eventfd 入門介紹

什么是 eventfd ?

eventfd 是 Linux 的一個系統調用,創建一個文件描述符用于事件通知,自 Linux 2.6.22 以后開始支持。

接口及參數介紹

#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);

eventfd() 創建一個 eventfd 對象,可以由用戶空間應用程序實現事件等待/通知機制,或由內核通知用戶空間應用程序事件。
該對象包含了由內核維護的無符號64位整數計數器 count 。使用參數 initval 初始化此計數器。

struct eventfd_ctx {
    struct kref kref;
    wait_queue_head_t wqh;
    /*
     * Every time that a write(2) is performed on an eventfd, the
     * value of the __u64 being written is added to "count" and a
     * wakeup is performed on "wqh". A read(2) will return the "count"
     * value to userspace, and will reset "count" to zero. The kernel
     * side eventfd_signal() also, adds to the "count" counter and
     * issue a wakeup.
     */
    __u64 count;
    unsigned int flags;
};

flags 可以是以下值的 OR 運算結果,用以改變 eventfd 的行為。

  • EFD_CLOEXEC (since Linux 2.6.27)
    文件被設置成 O_CLOEXEC,創建子進程 (fork) 時不繼承父進程的文件描述符。
  • EFD_NONBLOCK (since Linux 2.6.27)
    文件被設置成 O_NONBLOCK,執行 read / write 操作時,不會阻塞。
  • EFD_SEMAPHORE (since Linux 2.6.30)
    提供類似信號量語義的 read 操作,簡單說就是計數值 count 遞減 1。

在 Linux 2.6.26 版本之前,沒有使用參數 flags,必須指定為 0。

操作方法

一切皆為文件是 Linux 內核設計的一種高度抽象,eventfd 的實現也不例外,我們可以使用操作文件的方法操作 eventfd。

  • read(): 讀取 count 值后置 0。如果設置 EFD_SEMAPHORE,讀到的值為 1,同時 count 值遞減 1。
  • write(): 其實是執行 add 操作,累加 count 值。
  • epoll()/poll()/select(): 支持 IO 多路復用操作。
  • close(): 關閉文件描述符,eventfd 對象引用計數減 1,若減為 0,則釋放 eventfd 對象資源。

使用場景

在 pipe 僅用于發出事件信號的所有情況下,都可以使用 eventfd 取而代之。

參考資料

http://man7.org/linux/man-pages/man2/eventfd2.2.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • 一、Python簡介和環境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,804評論 0 10
  • 名稱 libev - 一個 C 編寫的功能全面的高性能事件循環。 概要 示例程序 關于 libev Libev 是...
    hanpfei閱讀 15,380評論 0 5
  • 夜晚落寂化作孤城,一首歌就在耳畔不斷想起,情緒似孤魂野鬼般蒼臺,一番電話通過后,正視下自我內心世界,真是讓內心波濤...
    菲唲閱讀 158評論 0 0
  • 好開心呀!你呢孔雀?。
    藍山Siyu閱讀 189評論 0 0