相当于Bash中的select()系统调用

时间:2016-05-05 11:37:19

标签: linux bash select

在我的脚本中,我试图从几个串口读取数据以协调多个设备。

我可以使用exec 9</dev/ttyACM0 && exec 8</dev/ttyACM1等打开串口的文件描述符。

我正在跳跃我可以在这些文件描述符上执行类似select()的操作来等待数据到达,然后使用read 0<&9read 0<&8处理它,具体取决于哪一个已接收数据。很遗憾,我找不到等同于select()的Bash。

我能找到的最接近的是使用read -t 0 0<&9轮询要读取的数据。我不喜欢这个,因为它需要sleep来阻止脚本消耗100%的处理器。虽然亚秒级睡眠是可能的,例如while true; do sleep 0.01; done这会消耗我系统上约4%的处理器。我可以将其恢复到0.1秒并将其降低至<1%但它仍然没有“感觉”正确的方式,因为它为设备之间的任何协调增加了至少100ms的额外延迟。

这有什么解决方案吗?是否有Bash select()等效?

1 个答案:

答案 0 :(得分:3)

引用格雷格的Bash Wiki http://mywiki.wooledge.org/ProcessManagement

  

没有相当于select(2)或poll(2)的shell脚本   系统调用。如果您需要管理一系列复杂的子进程   和事件,不要尝试在shell脚本中执行此操作。 (那说,那里   在本页的高级部分http://mywiki.wooledge.org/ProcessManagement#advanced中有一些技巧。)