【问题标题】:setTimeOut Equivalent in c?setTimeOut 等价于 c?
【发布时间】:2012-04-15 06:04:35
【问题描述】:

我正在处理 pthread 多线程代码,每个线程都在文件描述符上调用 read()。 read() 是一个阻塞调用,因此它等待数据。但我希望它只等待 3 秒来等待数据。

我曾想过使用alarm() 和hadling SIGALRM,但如果我在一个线程中发出警报,所有线程都会收到该SIGALRM 信号,并且所有线程都将放弃读取。我该怎么做?

【问题讨论】:

    标签: c sockets pthreads


    【解决方案1】:

    为此使用select 呼叫。它有一个参数允许您指定超时。

    select 的 Linux 手册页有一个示例用法,您可以在此处和网络上的其他地方找到很多示例。

    如果您不担心便携性,还有更多现代/功能丰富的选项。

    您可能希望研究库以将所有内容抽象出来。 libevent 值得一看,它封装了上述大部分操作系统特定的接口。

    【讨论】:

    • select 已弃用。 epoll 是当今人们使用的。
    • 哦,是的,我认为这应该可行。我以前从未考虑过使用 select() 。除了多路复用之外,我从未考虑过 select()。
    • @VladLazarenko:“弃用”是一个有点强硬的措辞。 epoll 不可移植,select 不会很快消失。当然还有更现代的替代品,但它们也(IMO)通常更难正确。
    • @Mat:对于一个可移植的解决方案,你最好使用像 libevent 这样的库,尽管它有很多自己的缺点。但是,是的——它不是可移植的,并不是所有的功能都可以在旧内核上使用,比如 eventfd 还没有在 Android 中。但坦率地说,epoll 比任何 select/poll 功能强大得多,恕我直言,更容易使用。我觉得 epoll 和 kqueue 在这里值得一提,而不仅仅是提到 select。
    • @VladLazarenko:然后随时发布答案:)
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多