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

Sim*_*fie 5 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%,但它仍然“感觉”不是正确的方法,因为它为设备之间的任何协调增加了至少 100 毫秒的额外延迟。

有什么解决办法吗?是否有 Bash select() 等价物?

Bor*_*lić 4

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

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