gpt4 book ai didi

linux - Rust mio 甚至在 stdin 上也总是报告

转载 作者:太空狗 更新时间:2023-10-29 12:24:57 45 4
gpt4 key购买 nike

我尝试向 mio 添加一些 fds,包括标准输入。我的应用程序在尝试从 stdin 读取时卡住,在我从 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 上.

最佳答案

我的强烈猜测是,不是 fd 0 (stdin) 而是 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

你只能推断,u32/u64=0的两个注册文件描述符之一现在是可读的,但你不能在这里区分fd 0和fd 3!并且由于从 stdin block 读取它必须是 fd 3。

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

关于linux - Rust mio 甚至在 stdin 上也总是报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851378/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com