Linux 新api eventfd(转)
轉自http://www.cppblog.com/peija/archive/2010/10/07/128941.html
eventfd 在內核版本,2.6.22以后有效。查看內核版本可以用命令 uname -r 。
1 #include <sys/eventfd.h> 2 int eventfd(unsigned int initval, int flags);這個函數會創建一個 事件對象 (eventfd object), 用來實現,進程(線程)間 的 等待/通知(wait/notify) 機制. 內核會為這個對象維護一個64位的計數器(uint64_t)。
?并且使用第一個參數(initval)初始化這個計數器。調用這個函數就會返回一個新的文件描述符(event object)。2.6.27版本開始可以按位設置第二個參數(flags)。
有如下的一些宏可以使用:
EFD_NONBLOCK , 功能同open(2) 的O_NONBLOCK,設置對象為非阻塞狀態,如果沒有設置這個狀態的話,read(2)讀eventfd,并且計數器的值為0 就一直堵塞在read調用當中,要是設置了這個標志, 就會返回一個 EAGAIN 錯誤(errno = EAGAIN)。效果也如同 額外調用select(2)達到的效果。
EFD_CLOEXEC 我的理解是,這個標識被設置的話,調用exec后會自動關閉文件描述符,防止泄漏。
如果是2.6.26或之前版本的內核,flags 必須設置為0。
創建這個對象后,可以對其做如下操作。
write 將緩沖區寫入的8字節整形值加到內核計數器上。
read 讀取8字節值, 并把計數器重設為0. 如果調用read的時候計數器為0, 要是eventfd是阻塞的, read就一直阻塞在這里,否則就得到 一個EAGAIN錯誤。
如果buffer的長度小于8那么read會失敗, 錯誤代碼被設置成 EINVAL。
poll select epoll
close 當不需要eventfd的時候可以調用close關閉, 當這個對象的所有句柄都被關閉的時候,內核會釋放資源。 為什么不是close就直接釋放呢, 如果調用fork 創建
進程的時候會復制這個句柄到新的進程,并繼承所有的狀態。?
下面是一個例子
這個API還是很有用的, 當你想要編寫并發型服務器的時候,aventfd 可以完美取代 pipe去通知(喚醒)其他的進程(線程)。比如經典的異步IO reactor/selector?
應用場景,去喚醒select的調用。他的緩沖區處理非常方便, 規定只有8字節。
?
轉載于:https://www.cnblogs.com/minuse/p/7472795.html
總結
以上是生活随笔為你收集整理的Linux 新api eventfd(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java接口的理解
- 下一篇: 2、Python连接Mysql数据库。