2017-06-30 40 views
2

我试着向mio添加几个fds,包括标准输入。 我的应用程序陷入困境,试图从标准输入读取,从mio得到一个事件后,该标准输入可读。锈mio总是报告即使stdin

当我调整应用程序时,我注意到mio使用epoll_wait并且该系统调用立即返回。

strace -e trace=epoll_create,epoll_ctl,epoll_wait,read,epoll_create1 ./target/debug/ongybar 

epoll_create1(EPOLL_CLOEXEC)   = 6 
epoll_ctl(6, EPOLL_CTL_ADD, 7, {EPOLLIN|EPOLLET, {u32=4294967295, u64=18446744073709551615}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 3, {EPOLLIN, {u32=0, u64=0}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 0, {EPOLLIN, {u32=0, u64=0}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 4, {EPOLLIN, {u32=4, u64=4}}) = 0 
epoll_wait(6, [{EPOLLIN, {u32=4, u64=4}}], 4, -1) = 1 
read(4, "[...], 8192) = 1004 
epoll_wait(6, [{EPOLLIN, {u32=0, u64=0}}], 4, -1) = 1 
read(0, 

完整的代码,我有遇到这个是github

回答

1

我有很强的猜测是,这不是的fd 0(标准输入),但的fd 3成为可读: 这里

epoll_ctl(6, EPOLL_CTL_ADD, 3, {EPOLLIN, {u32=0, u64=0}}) = 0 
epoll_ctl(6, EPOLL_CTL_ADD, 0, {EPOLLIN, {u32=0, u64=0}}) = 0 

你可以看到,的fd 0和3 与epoll_data U32/U64注册= 0

这里

epoll_wait(6, [{EPOLLIN, {u32=0, u64=0}}], 4, -1) = 1 

你只能推断,与U中的二级注册文件描述符的一个32/u64 = 0现在可读,但您无法在这里区分fd 0和fd 3!并且由于从标准输入块读取它必须是fd 3.

解决方法是为每个文件描述符使用u32/u64的唯一标识符,以便正确识别具有活动的正确文件描述符。