2011-03-28 68 views
3

我曾與libevent2一段時間,但通常我用它來處理網絡I/O(使用套接字)。現在我需要閱讀許多不同的文件,所以我也想使用它。我創建了這段代碼:問題處理文件I/O與libevent2

int file = open(filename, O_RDONLY); 
struct event *ev_file_read = event_new(ev_base, file, EV_READ | EV_PERSIST, read_file, NULL); 

if(event_add(ev_file_read, NULL)) 
     error("adding file event"); 

不幸的是它不起作用。嘗試添加事件時收到此消息:

[警告] Epoll ADD(1)在fd 7上失敗。舊事件爲0;讀取更改爲1(添加);寫變化爲0(無):不允許操作 添加文件事件:操作不允許

文件存在,並有權讀/寫。

任何人有任何想法如何使用libevent處理文件IO?我還想過關於緩衝事件,但在API中只有函數bufferevent_socket_new(),這不適用於此。

在此先感謝。

回答

5

我需要libevent來閱讀許多關於優先級的文件。問題在於epoll沒有解放。 Epoll不支持常規的Unix文件。

爲了解決它,我被迫libevent的不使用epoll的:

struct event_config *cfg = event_config_new(); 

event_config_avoid_method(cfg, "epoll"); 

ev_base = event_base_new_with_config(cfg); 
    event_config_free(cfg); 

下一頁方法的優先名單上是民意調查,其完全支持文件只是因爲我想。

謝謝大家的回答。

+0

哦,上帝,我浪費了太多時間試圖弄清楚這一點。謝謝 – c00kiemon5ter 2012-04-04 01:46:42

1

如果你想做異步磁盤I/O你可能想檢查aio_ *家庭(見man(3)aio_read)。它是POSIX.1-2001,可用於Linux和bsd(至少)。

用於與libevent的積分AIO操作,請參閱libevent aio patchrelated stackoverflow post提及使用signalfd(2)來路由AIO信號事件可以與各種FD事件輪詢實現中使用(因此隱含地libevent的循環)一個文件描述符。

編輯:libevent也有信號處理支持(完全忘了這一點),所以你可以嘗試註冊/處理與libevent循環直接/ /處理aio信號。如果你的開發規則允許你,我會親自去嘗試libevent補丁。

2
+3

哦,它想要這樣的事情很有意義,相信我。你可以通過添加一個間接級別來獲得它,見下面(或上面)。 – user237419 2011-03-28 19:54:58

+0

這與常規文件描述符無關。直接與 – 2011-03-29 06:08:32

+2

無關,我不敢說相反;但你仍然可以設法將磁盤I/O集成到一個現有的事件循環中,這可以消除一些複雜性,減少響應時間等(例如靜態的,只讀的http文件服務) – user237419 2011-03-29 06:56:14