2017-06-30 5 views
2

stioを含めてmioにいくつかのfdsを追加しようとしました。 mioからイベントを取得した後、アプリケーションがstdinから読み込もうとしたときにstdinが読み込み可能になりました。rust mioはいつもstdinでも報告します

私がアプリケーションをストライドしたとき、mioはepoll_waitを使用しており、syscallが即座に戻ることに気付きました。

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

私の強力な推測が0(STDIN)fdがないこと、ですが、3が読みになったfdが:あなたが見ることができる ここ

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 

、それは0 FDと3はepoll_data U32/U64に登録の両方をあります= 0

そしてここ

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

あなただけの、uの2つの登録されたファイル記述子の1つを推測することができます32/u64 = 0は現在読めるが、fd 0とfd 3を区別することはできない!そして、stdinブロックから読み取るので、fdにする必要があります。3

解決策は、各ファイル記述子がu32/u64のユニークな識別子を使用して、アクティビティを持つ正しいファイル記述子を適切に識別できるようにすることです。

関連する問題