4

我使用 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 有什么不利之处吗?

4

1 回答 1

1

两种典型的解决方案:

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

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

于 2013-10-08T21:50:03.817 回答