【问题标题】:Wake up blocking serial port read in Linux在 Linux 中唤醒阻塞串行端口读取
【发布时间】:2013-10-08 17:23:52
【问题描述】:

我使用 select() 调用在不断读取数据的专用线程中无限期地阻塞串行端口 fd。不过,我想不出一种从我的选择呼叫中醒来的方法(除非我设置了超时等)。在套接字编程中,您可以调用 shutdown() 来唤醒 select() 上阻塞的任何线程。

虽然使用串行端口,但我看不到任何模拟。当我的“阅读器”线程在 select() 上被阻塞时,从另一个线程调用 close() 在 POSIX 上似乎不是明确定义的行为。特别是在 Linux 上,在 fd 上调用 close() 不会唤醒在该 fd 上调用 select() 的任何线程。来自(http://linux.die.net/man/2/select):

如果 select() 监视的文件描述符在另一个线程中关闭,则结果未指定。在某些 UNIX 系统上,select() 解除阻塞并返回,并指示文件描述符已准备好(后续 I/O 操作可能会失败并出现错误,除非在 select() 返回和已执行 I/O 操作)。在 Linux(和其他一些系统)上,关闭另一个线程中的文件描述符对 select() 没有影响。总之,在这种情况下依赖于特定行为的任何应用程序都必须被视为有缺陷。

是否有可能在 Linux 中唤醒一个在串口 fd 上无限期阻塞的线程,如果可以,如何唤醒?

编辑:

有一种'hack'-ish 方法可以通过在 sleep() 循环中调用 select() 来解决这个问题(这并不理想,因为现在在唤醒请求和线程实际唤醒之间存在延迟) .明智地在循环系统中调用 select 有什么不利之处吗?

【问题讨论】:

  • Select 调用应该在任何集合中的任何描述符上发生事件时立即唤醒。也许您也需要将描述符放入异常集中?
  • 我会试试这个,因为现在我只在读取 fds 中有它,但基于 desc。在我更新的答案中,它似乎不可靠
  • 编辑 -- 即使 fd 被添加到异常集中也不会发生任何事情。

标签: c linux serial-port


【解决方案1】:

两种典型的解决方案:

  1. 创建管道并将其添加到选择队列。只要您通过此管道发送数据 - 选择退出。

  2. 如果唤醒所有线程不成问题,您可以发送信号。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2011-01-29
    • 2016-10-24
    相关资源
    最近更新 更多