我試圖用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)));
}
}
檢查您的返回值!任何這些事情都可能失敗,你永遠不知道。 –
將'timeout'設置爲'-1'而不是'0'。來吧,這是第一件要做的事 - 閱讀手冊! –