gpt4 book ai didi

c++ - 我可以使用 select 来组合 stdin 和 accept 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:03 26 4
gpt4 key购买 nike

我正在尝试在 C++/Linux 中实现一个服务器,该服务器定期从终端获取用户输入。最初我实现了两个单独的线程来处理这种行为。但我意识到我需要类似 pthread_cancel 的东西来取消服务器线程,以防用户想要关闭服务器。

然后我决定在同一个线程中处理这两个操作可能会更好,这样我就不必担心资源泄漏。所以我现在拥有的是一个“选择”调用,它选择标准输入 fd 以及我接受的 fd。我的代码看起来像这样......

fdset readfds;
FD_SET(acceptfd, &readfds);
FD_SET(stdinfd, &readfds);
while(1) {
select(n, &readfds, NULL, NULL, NULL);
....
}

出于某种原因,我无法再从标准输入读取输入。当我从我的 fd 集中删除两个 fd 中的任何一个时,这工作正常,另一个 ome 按预期执行。但是当我把它们都留在里面时,虽然 acceptfd 仍然接受传入连接,但 stdinfd 无法响应终端输入。

有谁知道我在这里可能做错了什么?这种方法是否存在固有缺陷?我是否应该专注于将这两个操作保持为单独的线程,并找出一种干净退出的方法?

感谢阅读!!

最佳答案

正如 Ambroz 评论的那样,多路复用标准输入和一些监听的 fd 是可能的。

但是 select 是一个古老的、几乎过时的系统调用,您应该更喜欢使用 poll(2) .如果您坚持仍然使用select(2) 系统调用,您应该首先清除readfds,并在循环内使用FD_ZERO。而 FD_SET 宏应该在 while 循环内,因为 select 被允许修改 readfds

poll 系统调用优于 select,因为 select 对进程可以拥有的文件描述符的数量施加了限制(通常为 1024,而内核现在能够处理更大数量的 fds,例如 65536)。换句话说,select 要求每个 fd 都小于 1024(今天是错误的)。 poll 可以处理任意一组任意fd。 poll 的第一个参数是一个数组(如果您愿意,可以calloc),其大小是您要多路复用的 fds 的数量。在你的例子中,它是两个(stdin 和第二个监听的 fd),所以你可以使它成为一个局部变量。请务必在每次调用 poll 之前清除并初始化它。

您可以使用像 gdb 这样的调试器进行调试,或者只使用 strace

关于c++ - 我可以使用 select 来组合 stdin 和 accept 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11704823/

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