繁体   English   中英

在Linux中唤醒阻塞串口读取

[英]Wake up blocking serial port read in Linux

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

虽然有串口,我看不到任何模拟。 当我的'reader'线程在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上无限期地唤醒一个被阻塞的线程,若然,怎么办?

编辑:

通过在sleep()循环中调用select()来解决这个问题有一种“黑客”方法(虽然现在唤醒请求和实际唤醒的线程之间存在延迟)但这并不理想。 在循环系统中明智地调用select有什么不利吗?

两种典型解决方案

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM