【问题标题】:The result of FD_ISSET without calling `select`FD_ISSET 没有调用`select`的结果
【发布时间】:2020-12-07 07:11:22
【问题描述】:

我正在使用书籍Unix Network Programming 学习套接字编程。以下是本书中的两段代码:

如我们所见,它在FD_SET 之后调用FD_ISSET 而没有在它们之间调用select 函数,结果是什么?如果sockfd 是可写的,它会是true 吗?

PS:源码http://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch16lev1sec2.html

【问题讨论】:

  • FD_SETFD_ISSET 与任何套接字没有内在连接。它们在提供的集合上运行。由代码通过select 调用或在这种情况下似乎完成的一些其他逻辑来正确设置它们。

标签: c sockets network-programming


【解决方案1】:

FD_SET 只是在位掩码中设置一个位,FD_ISSET 检查该位。这些调用不关心该位是否表示文件描述符,它只是一个整数。如果这些调用之间没有任何操作位掩码(即没有调用select),那么FD_ISSET 的结果准确反映了FD_SET 设置的内容。

【讨论】:

    【解决方案2】:

    两个 sn-ps 之间有 30 行缺失,我们怎么知道那里没有调用 select

    除此之外,select 函数没有做任何特别的事情,它只是从集合中清除描述符。

    如果您直接调用FD_SET(sockfd, &wset) 后跟FD_ISSET(sockfd, &wset),则FD_ISSET 宏将简单地计算为“真”(非零整数值)。

    【讨论】:

    • 谢谢。我在问题中发布了指向源代码的链接,在那里可以找到缺少的 30 行。
    • select 清除标志,然后等待文件描述符准备好并重新设置标志。对吗?
    • @xingbin select 的确切作用取决于它的实现,但在某种程度上是的,这是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多