Linux,取消阻塞read()

在用于串行通信的多线程Linux程序中,是否有可能(以及最好的方法)终止来自另一个线程的阻塞read()调用?

我希望尽可能保持一切反应,并避免在重复轮询时使用超时.

这个问题的背景是我正在尝试使用JNI为Linux创建一个Scala串行通信库.我试图保持原生方尽可能简单,除其他外,提供read()和close()函数.在Scala端,一个线程将调用read()并阻塞,直到来自串行端口的数据可用.但是,串口可以通过其他方式关闭,从而调用close().现在,为了释放被阻止的线程,我会以某种方式取消系统读取调用.

最佳答案
一个相当流行的技巧:不是在read()中阻塞,而是在串行套接字和管道上的select()中阻塞.然后当另一个线程想要唤醒你的线程时,它可以通过将一个字节写入该管道的另一端来实现.该字节将导致select()返回,您的线程现在可以清理并退出或无论需要做什么. (注意,为了使这项工作100%可靠,您可能希望将串行套接字设置为非阻塞,以确保您的线程仅在select()中阻塞而从不在read()中阻塞

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...