我使用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()来解决这个问题,这是一种'hack'-ish方法(虽然现在唤醒请求和实际唤醒的线程之间存在延迟)但这并不理想。 。在循环系统中明智地调用select是否有任何不利之处?
答案 0 :(得分:1)
两种典型的解决方案:
创建管道并将其添加到选择队列。只要您通过此管道发送数据 - 选择退出。
如果唤醒所有线程不是问题,您可以发送信号。