搜尋
首頁系統教程LinuxLinux中的神器:eventfd的原理與應用

Linux中的神器:eventfd的原理與應用

Feb 13, 2024 pm 08:30 PM
技巧命令overflow

Linux是一個強大的作業系統,它提供了許多高效的進程間通訊機制,如管道、訊號、訊息佇列、共享記憶體等。但是,有沒有一種更簡單、更靈活、更有效率的溝通方式呢?答案是有的,就是eventfd。 eventfd是Linux 2.6版本引入的一種系統調用,它可以用來實現事件通知,也就是透過一個檔案描述符來傳遞事件。 eventfd包含一個由核心維護的64位元無符號整數計數器,進程可以透過對這個檔案描述子進行read/write來讀取/改變計數器的值,從而實現進程間通訊。 eventfd有什麼優點呢?它有以下幾個特點:

Linux中的神器:eventfd的原理與應用

  • # eventfd不需要建立任何額外的檔案或記憶體空間,只需要一個檔案描述子;
  • eventfd可與select、poll、epoll等多工機制結合使用,實現高效率的事件驅動程式設計;
  • eventfd可以設定為非阻塞或信號量模式,提供了不同的通訊語意;
  • eventfd可以跨越行程或執行緒邊界,實作不同層級的通訊。

那麼,eventfd是如何運作的呢?它又有哪些應用場景呢?本文將從原理和應用兩個面向來介紹eventfd這個神器。

一般來說:Linux進程間通訊有五大方案:管道,訊息隊列,信號量,共享內存,套接字。
管道我不是很熟,只了解一般管道局限與父子進程之間,首先就被我排除了,因為我要做的是相互獨立的進程間通信,命名管道似乎不局限於父子進程,但在內核態怎麼使用不清楚。
訊息隊列完全不了解。
信號量的核心是一個核心變數的原子操作,但介面只體現在用戶態,而且信號量的P V操作更多做的好像是互斥,而不是我想要的通知喚醒機制。
共享記憶體就更麻煩了,介面只在用戶態,如果自己想做內核態與用戶態之間的共享內存,得自己寫file,然後提供mmap接口。
在套接字之前只是用過af_inet的tcp/udp與af_unix的dgram,還是上面的那個問題,內核沒有明確的接口提供,雖然可以自己去用比如sock->ops->recvmsg這樣的函數去調用,但畢竟需要自己構造入參,感覺還是不太安全。

那麼剩下的似乎只有netlink了,這個socket明確地提供了核心的發包函數,因為它明確地export出了netlink_kernel_create函數,所以內核態的函數得以用這個sock來進行發包。但一個是用戶態需要註冊收包函數,另一個核心態發包還是免不了要組裝skb,對於我單純地只想進行通知喚醒來說還是太複雜了。

於是我再次尋找,發現了eventfd這個神器,在KVM與Qemu的通信之間,eventfd被大牛使用的出神入化,仔細地分析了一下源碼,發現這個東西就如名字所說,純是為了通知而存在的。
作為一個file(linux裡有不是file的東西麼~~),它的private_data結構體 eventfd_ctx只有可憐的四個變數。

struct eventfd_ctx {
  struct kref kref;  /* 这个就不多说了,file计数用的,用于get/put */
  wait_queue_head_t wqh; /* 这个用来存放用户态的进程wait项,有了它通知机制才成为可能 */
/*
\* 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;  /* 这个就是一个技术器,应用程序可以自己看着办,read就是取出然后清空,write就是把value加上 */
  unsigned int flags;  /* 所有的file都有的吧,用来存放阻塞/非阻塞标识或是O_CLOEXEC之类的东西 */
};
  我之所以选用它是因为它有 eventfd_signal 这个特地为内核态提供的接口,下面的是注释。
 \* This function is supposed to be called by the kernel in paths that do not
 \* allow sleeping. In this function we allow the counter to reach the ULLONG_MAX
 \* value, and we signal this as overflow condition by returining a POLLERR to poll(2).

其實看程式碼會更清晰一些

int eventfd_signal(struct eventfd_ctx *ctx, int n)
{
  unsigned long flags;

  if (n return -EINVAL;
  spin_lock_irqsave(&ctx->wqh.lock, flags);
  if (ULLONG_MAX - ctx->count count);
  ctx->count += n;
  if (waitqueue_active(&ctx->wqh))
    wake_up_locked_poll(&ctx->wqh, POLLIN);
  spin_unlock_irqrestore(&ctx->wqh.lock, flags);

  return n;
}  

本質就是做一次喚醒,不用read,也不用write,與eventfd_write的差別是不用阻塞

#下面說一下我的具體用法:
內核狀態是一個模組,註冊一個misc設備,建立核心執行緒工作(參數為模組的file->private_data)。提供ioctl介面供用戶態進程下發自己eventfd所建立的fd,保存在核心執行緒可以存取的file->private_data中。
當核心態想通知用戶態時,直接使用eventfd_signal,此時用戶態執行緒需要先把自己放在eventfd_ctx->wqh上,有兩個方案,一個是呼叫read,一個是呼叫poll。如果是read,之後會將eventfd_ctx->count清零,下次還能阻塞住。但如果使用poll,之後count並未清零,導致再次poll時,即使核心態沒有eventfd_signal,poll也會即時回傳。
使用者態通知核心態稍微麻煩一點,,首先需要再建立一個eventfd,然後下發給file->private_data(這裡的操作同上面),額外需要在模組裡做一個iotcl,專門負責使用者態來通知核心態,函數裡就做eventfd_signal,內核態線程需要先放在eventfd_ctx->wqh上,可以利用vfs_read,或是自己在核心態做一次poll(似乎又麻煩了)。

本文介紹了eventfd這個Linux中的神器,它是一種簡單、靈活、有效率的進程間通訊機制。我們從原理方面分析了eventfd的創建、讀寫和標誌位等內容,並且給出了相應的程式碼範例。我們也從應用方面介紹了eventfd在用戶態與內核態通訊、定時器和事件觸發器等場景中的使用方法,並且給出了對應的程式碼範例。透過本文的學習,我們可以掌握eventfd的基本用法,並且能夠在實際開發中靈活地運用eventfd來實現不同的通訊需求。希望本文對你有幫助!

以上是Linux中的神器:eventfd的原理與應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
很難學習Linux嗎?很難學習Linux嗎?Apr 18, 2025 am 12:23 AM

學習Linux並不難。 1.Linux是一個開源操作系統,基於Unix,廣泛應用於服務器、嵌入式系統和個人電腦。 2.理解文件系統和權限管理是關鍵,文件系統是層次化的,權限包括讀、寫和執行。 3.包管理系統如apt和dnf使得軟件管理方便。 4.進程管理通過ps和top命令實現。 5.從基本命令如mkdir、cd、touch和nano開始學習,再嘗試高級用法如shell腳本和文本處理。 6.常見錯誤如權限問題可以通過sudo和chmod解決。 7.性能優化建議包括使用htop監控資源、清理不必要文件和使用sy

Linux管理員的薪水是多少?Linux管理員的薪水是多少?Apr 17, 2025 am 12:24 AM

Linux管理員的平均年薪在美國為75,000至95,000美元,歐洲為40,000至60,000歐元。提升薪資可以通過:1.持續學習新技術,如雲計算和容器技術;2.積累項目經驗並建立Portfolio;3.建立職業網絡,拓展人脈。

Linux的主要目的是什麼?Linux的主要目的是什麼?Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

互聯網在Linux上運行嗎?互聯網在Linux上運行嗎?Apr 14, 2025 am 12:03 AM

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作是什麼?Linux操作是什麼?Apr 13, 2025 am 12:20 AM

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

使用Linux別名提高自定義命令快捷方式的生產率使用Linux別名提高自定義命令快捷方式的生產率Apr 12, 2025 am 11:43 AM

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux實際上有什麼好處?Linux實際上有什麼好處?Apr 12, 2025 am 12:20 AM

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中