【问题标题】:What to use the "fd_set *writefds" parameter in the select() statement for在 select() 语句中使用“fd_set *writefds”参数的用途
【发布时间】:2011-08-16 09:45:09
【问题描述】:

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

    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);

我知道将 readfds 参数用于什么用途:使用此参数,您可以查看数据是否已写入您的套接字之一。另一方面,我发现的 writefds 页面指出,这是为了查看“是否有任何套接字准备好发送()数据”。但是,这是什么意思?在 Quin 和 Shute 的 Windows Sockets Network Programming 中,它说这会检测连接状态或可写状态。这有什么意义?是否只是检查套接字是否仍然与已连接的客户端连接并测试向该套接字写入内容是否有任何用处?

那么:通常使用 writefds 做什么?

【问题讨论】:

  • select 确实是一个过时的界面。如果可能的话,我建议使用 libevent 之类的库(它是 BSD 许可的)

标签: c


【解决方案1】:

如果您一直在向TCP 套接字写入数据,而另一方的接收速度不如您发送的那么快,则可能会出现write 阻塞。你想避免这种情况,所以你需要测试“你可以在没有阻塞的情况下编写”。因为这通常不会在测试程序中发生,所以可能会令人震惊,但 write(2)send(2) 可以阻止

所以如果select(2)fd 设置在writefds 中,那么这意味着任何writesend 实际上都会写入至少一个字节而不会阻塞。

编辑

来自the standard

pselect() 函数应检查其文件描述符集 地址在 readfds、writefds 和 errorfds 参数中传递 看看他们的一些描述符是否准备好阅读,是 准备写作,或有异常情况未决, 分别。

【讨论】:

  • 好的,这就是我正在寻找的答案。对了,为什么你写的是select(2)而不是select(),是什么意思?
  • @Django 这是manual section2 用于系统调用。
  • 好的,我明白了。我一直在搜索这些页面以找出 writefds 的确切含义 a.o。其中描述了 select(2) 但我找不到它。是在这些页面的某个地方吗?
  • 是的,我看到了,但是你从哪里得到可写状态意味着它将发送至少一个字节的多汁细节?
  • @Django 如果它是可写的,它必须发送一些东西。在实践中,我只见过write 这样做几次(当被讨厌的内核模块强制时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
相关资源
最近更新 更多