Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux中的唤醒阻止串行端口读取_C_Linux_Serial Port - Fatal编程技术网

C Linux中的唤醒阻止串行端口读取

C Linux中的唤醒阻止串行端口读取,c,linux,serial-port,C,Linux,Serial Port,我使用select()调用无限期地阻塞持续读取数据的专用线程中的串行端口fd。不过,我想不出从select呼叫中醒来的方法(除非我设置了超时等)。在sockets编程中,可以调用shutdown()来唤醒select()上阻塞的所有线程 但对于串行端口,我看不到任何模拟。当我的“reader”线程在select()上被阻塞时,从另一个线程调用close()在POSIX上似乎不是定义良好的行为。特别是在Linux上,在fd上调用close()不会唤醒在该fd上调用select()的任何线程。Fro

我使用select()调用无限期地阻塞持续读取数据的专用线程中的串行端口fd。不过,我想不出从select呼叫中醒来的方法(除非我设置了超时等)。在sockets编程中,可以调用shutdown()来唤醒select()上阻塞的所有线程

但对于串行端口,我看不到任何模拟。当我的“reader”线程在select()上被阻塞时,从另一个线程调用close()在POSIX上似乎不是定义良好的行为。特别是在Linux上,在fd上调用close()不会唤醒在该fd上调用select()的任何线程。From():

如果select()监视的文件描述符在另一个线程中被关闭,则结果是未指定的。在某些UNIX系统上,select()取消阻止并返回,并指示文件描述符已准备就绪(后续I/O操作可能会失败并出错,除非在select()返回和执行I/O操作之间再次打开文件描述符)。在Linux(和其他一些系统)上,关闭另一个线程中的文件描述符对select()没有影响。总之,在此场景中依赖于特定行为的任何应用程序都必须被视为有缺陷

在Linux中,是否可能唤醒串行端口fd上无限期阻塞的线程,如果可能,如何唤醒

编辑:

有一种类似“黑客”的方法可以绕过这个问题,方法是使用sleep()在循环中调用select()(但这并不理想,因为现在在唤醒请求和线程实际唤醒之间存在延迟)。在循环系统中调用select有什么不好的地方吗?

两种典型的解决方案:

  • 创建管道并将其添加到“选择队列”。一旦通过此管道发送数据,请选择“出口”

  • 如果唤醒所有线程不是问题,您可以发送一个信号


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