在我的脚本中,我试图从几个串口读取数据以协调多个设备。
我可以使用exec 9</dev/ttyACM0 && exec 8</dev/ttyACM1
等打开串口的文件描述符。
我正在跳跃我可以在这些文件描述符上执行类似select()
的操作来等待数据到达,然后使用read 0<&9
或read 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()等效?
答案 0 :(得分:3)
引用格雷格的Bash Wiki http://mywiki.wooledge.org/ProcessManagement
没有相当于select(2)或poll(2)的shell脚本 系统调用。如果您需要管理一系列复杂的子进程 和事件,不要尝试在shell脚本中执行此操作。 (那说,那里 在本页的高级部分http://mywiki.wooledge.org/ProcessManagement#advanced中有一些技巧。)