2017-06-30 39 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的唯一標識符,以便正確識別具有活動的正確文件描述符。