c - 是否有必要在 select 系统调用之间重置 fd_set?

标签 c unix

我在使用 Unix 中的 select 函数时遇到问题。

我有一个等待连接的服务器。首先,我使用 FD_SET(listener, readfds) 将监听套接字文件描述符 listener 添加到 fd_set readfds,然后在 中使用它选择()

当我获得连接时,我调用accept() 并使用已接受的文件描述符在select 中设置readfds 并开始从连接接收数据。但是,当我检查 strace 中的代码时,当 select() 第二次执行时,select 不会在 readfds 中显示监听器。

在再次调用 select() 之前,是否需要使用 FD_SET(listener, readfds) 再次设置监听器文件描述符?

谢谢。

最佳答案

是的(需要在select() 系统调用之间重置fd_set)。

这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当select()返回,所有值都已修改以反射(reflect)准备好的文件描述符集。因此,每次调用 select() 之前,您都必须(重新)初始化 fd_set 值。

关于c - 是否有必要在 select 系统调用之间重置 fd_set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563577/

相关文章:

c - 不停止 while 循环未执行之前的语句

c++ - 这是什么样式的组件(intel、att...等?),我该如何生产它?

c - 如果不使用 sudo 运行,为什么这个带有 execl 的程序会中断?

linux - 根据匹配行合并两个 csv 文件并在 linux 中添加新列

c - 尝试消除共轭梯度内核中的 cudaDeviceSynchronize()

c - 如何将文件中的值包含到代码中

c - Intrinsic __lzcnt64 使用不同的编译选项返回不同的值

c - 为什么 open() 使用错误的权限创建我的文件?

linux - Unix 中 ls -lsh 中的“总计”

linux - 如何在 bash 中将多个结果从一个命令发送到另一个命令?