2017-06-30 63 views
0

我試圖用stdin和其他一些fd來做nonblocking IO。 我將它們添加到防鏽庫mio,但在使用strace進行調試期間,我發現這是一個epoll問題。epoll立即返回標準輸入

當我添加標準輸入到epoll時,epoll_wait立即返回。無論我是否已連接外殼/術語或管道別的東西(例如cat),都無關緊要。

的最小C代碼來觀察此:

#include <sys/epoll.h> 
#include <stdio.h> 
#include <unistd.h> 
int main(void) 
{ 
    char buffer[4096]; 
    int fd = epoll_create(5); 

    struct epoll_event event; 

    event.events = EPOLLIN; 
    event.data.fd = 0; 

    epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event); 

    for (;;) { 
     fprintf(stderr, "Going into epoll_wait\n"); 
     epoll_wait(fd, &event, 1, 0); 
     fprintf(stderr, "Going into read: %d\n", event.data.fd); 

     printf("%ld\n", read(0, buffer, sizeof(buffer))); 
    } 
} 
+1

檢查您的返回值!任何這些事情都可能失敗,你永遠不知道。 –

+1

將'timeout'設置爲'-1'而不是'0'。來吧,這是第一件要做的事 - 閱讀手冊! –

回答

2

超時值0 on epoll_wait()表示立即返回並僅報告當前未決事件。

你需要指定超時值-1,這意味着,「無限期地等待事件」:

epoll_wait(fd, &event, 1, -1); 

那麼就應該按預期工作。

+0

對,我當時很蠢。所以我搞砸了我最小的測試。 – Ongy

+0

@Ongy也許你把它與'select()'混合在一起,其中一個超時參數「0」(在那裏是一個NULL指針)意味着「無限期地等待」。 – Ctx

+0

我認爲民意調查也是。是。儘管我想使用的實際防鏽庫,使我能夠正確使用-1,這是我在示例代碼中犯的一個錯誤。我想把它作爲單獨的問題發佈(不用引用我被屠殺的代碼),但我必須等待90分鐘 - – Ongy

1

man epoll_wait

指定等於超時爲零原因epoll_wait()立即返回。