eventfd 入門介紹

什么是 eventfd ?

eventfd 是 Linux 的一個(gè)系統(tǒng)調(diào)用,創(chuàng)建一個(gè)文件描述符用于事件通知,自 Linux 2.6.22 以后開始支持。

接口及參數(shù)介紹

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

eventfd() 創(chuàng)建一個(gè) eventfd 對(duì)象,可以由用戶空間應(yīng)用程序?qū)崿F(xiàn)事件等待/通知機(jī)制,或由內(nèi)核通知用戶空間應(yīng)用程序事件。
該對(duì)象包含了由內(nèi)核維護(hù)的無符號(hào)64位整數(shù)計(jì)數(shù)器 count 。使用參數(shù) initval 初始化此計(jì)數(shù)器。

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 運(yùn)算結(jié)果,用以改變 eventfd 的行為。

  • EFD_CLOEXEC (since Linux 2.6.27)
    文件被設(shè)置成 O_CLOEXEC,創(chuàng)建子進(jìn)程 (fork) 時(shí)不繼承父進(jìn)程的文件描述符。
  • EFD_NONBLOCK (since Linux 2.6.27)
    文件被設(shè)置成 O_NONBLOCK,執(zhí)行 read / write 操作時(shí),不會(huì)阻塞。
  • EFD_SEMAPHORE (since Linux 2.6.30)
    提供類似信號(hào)量語(yǔ)義的 read 操作,簡(jiǎn)單說就是計(jì)數(shù)值 count 遞減 1。

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

操作方法

一切皆為文件是 Linux 內(nèi)核設(shè)計(jì)的一種高度抽象,eventfd 的實(shí)現(xiàn)也不例外,我們可以使用操作文件的方法操作 eventfd。

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

使用場(chǎng)景

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

參考資料

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容