Linux Kernel 2.6.22版本起加入eventfd機(jī)制,部分應(yīng)用場(chǎng)景下可用于替代pipe.
通常在事件機(jī)制里對(duì)信號(hào)的處理是這樣的 :
事件處理偽代碼 :
void event_proess(int fd) {
do {
read_pipe(); //讀取pipe內(nèi)容
process_pipe_event(); //轉(zhuǎn)換pipe內(nèi)容到對(duì)應(yīng)的自定義信號(hào)
} while (true);
}
這么做的缺點(diǎn)在于需要處理讀取到pipe的buf,映射到對(duì)應(yīng)的事件.
而eventfd不需要做事件映射
事件處理偽代碼 :
void event_proess(int fd) {
do {
read_eventfd(); //讀取eventfd
} while (true);
}
這里列舉一下eventfd的api :
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
eventfd實(shí)質(zhì)上就是生成了由用戶操作的一個(gè)文件句柄汰寓,可以被加入到epoll/select這樣的poll機(jī)制里.
獲取信號(hào)時(shí) 只需要讀取fd 得到對(duì)應(yīng)的寫入值 適合用作自定義信號(hào)處理
創(chuàng)建 :
int fd = eventfd(0, EFD_CLOEXEC);
設(shè)置信號(hào):
#define SIGNAL_POST 0x1
#define SIGNAL_GET 0x2
uint64_t val = SIGNAL_POST
ssize cnt = write(fd, &val, sizeof(val));
讀取信號(hào):
uint64_t val = 0;
ssize cnt = read(fd, &val, sizeof(val));
if (val == SIGNAL_POST) {
...
} else if (val == SIGNAL_GET) {
...
}
...