【问题标题】:let the system call `select()` block until a socket gets something to read让系统调用 `select()` 阻塞,直到套接字读取到某些内容
【发布时间】:2013-04-19 11:23:54
【问题描述】:

select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) 的手册页中,它说:

If timeout is a null pointer, the select blocks indefinitely.

indefinitely 是否表示一个任意长度的句点?

让线程阻塞在select() 直到套接字获取一些数据是好的吗?如果是这样,*timeout 应该是多少?

【问题讨论】:

    标签: c++ c sockets system-calls


    【解决方案1】:

    “无限期”不是任意的,它是永远的。如果timeout 指针是NULL,那么select 将永远阻塞,或者直到其中一组文件描述符“就绪”为止。

    【讨论】:

    • 感谢您的回答。您介意为 select() 提供一些关于 indefinitely = forever 的参考吗?
    • @user2207811 你可以查字典,这就是单词的意思(“无限或未指定的时间段”)。
    • @user2207811 来自The Free Dictionary:“没有任何时间或数量限制”。换句话说,永远。 :)
    • “应无限期阻止直到至少一个描述符满足指定标准。” (强调我的)pubs.opengroup.org/onlinepubs/9699919799/functions/…
    • 还要注意select可能会因为信号而提前返回,即使是那些打算不中断的信号:“如果为中断信号设置了SA_RESTART,则函数是否重新启动由实现定义或返回 [EINTR]。”
    【解决方案2】:

    不,“永远”等待不是一个好主意...如果拔下网络电缆,您的应用程序将冻结。您应该设置一个合理的超时时间(可能是几秒钟),以便在数据永远不会到达的情况下安全退出。

    【讨论】:

    • 这取决于您的应用程序在做什么。通常,在固定时间内没有收到数据时退出是不好的行为...
    • 如果我拔掉网线,一切都会冻结。因为应用程序充当服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多