“使用什么?”;fd_set*writefds";的select()语句中的参数

“使用什么?”;fd_set*writefds";的select()语句中的参数,c,C,这是select语句的原型(根据手册页): 我知道readfds参数的用途:通过这个参数,您可以查看数据是否写入了某个套接字。另一方面,我找到的writefds页面指出,这是为了查看“是否有任何套接字已准备好将()数据发送到”。但这意味着什么?在Quin和Shute编写的Windows Sockets网络编程中,它表示这会检测连接状态或可写状态。这有什么意义?是否只是检查套接字是否仍然与已连接的客户端有连接,并测试向该套接字写入内容是否有用 那么:人们通常使用writefds做什么 如果您继续向

这是select语句的原型(根据手册页):

我知道readfds参数的用途:通过这个参数,您可以查看数据是否写入了某个套接字。另一方面,我找到的writefds页面指出,这是为了查看“是否有任何套接字已准备好将()数据发送到”。但这意味着什么?在Quin和Shute编写的Windows Sockets网络编程中,它表示这会检测连接状态或可写状态。这有什么意义?是否只是检查套接字是否仍然与已连接的客户端有连接,并测试向该套接字写入内容是否有用


那么:人们通常使用writefds做什么

如果您继续向
TCP
套接字写入数据,而另一端的接收速度不如您发送的快,则会出现
write
阻塞的情况。您希望避免这种情况,因此需要测试“您可以无阻塞地编写”。由于这种情况通常不会发生在测试程序中,因此可能会引起震动,但是
写入(2)
发送(2)
会阻止

因此,如果
select(2)
表示在
writefds
中设置了
fd
,则表示其上的任何
write
send
实际上都会写入至少一个字节而不会阻塞

编辑 发件人:

函数的作用是检查文件描述符集 地址在readfds、writefds和errorfds参数中传递 要查看他们的一些描述符是否已准备好阅读,请访问 准备好写入,或有异常情况待处理, 分别


好的,这就是我想要的答案。顺便问一下,为什么写select(2)而不是select(),这是什么意思?@Django这是最重要的<代码>2用于系统调用。好的,我明白了。我一直在搜索这些页面,以找出writefds在描述select(2)时的确切含义,但我找不到它。是在这些页面中的某个地方吗?是的,好的,我看到了,但是你从哪里得到的有趣的细节,可写状态意味着它至少会发送一个字节?@Django如果它是可写的,它必须发送一些东西。在实践中,我只见过
write
这样做过几次(当一个讨厌的内核模块迫使我这么做时)。select确实是一个过时的接口。如果可能的话,我建议使用libevent之类的库(它是BSD许可的)
    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);