3

我有一个看起来像这样的脚本:

while true; do
    read -t10 -d$'\n' input_from_serial_device </dev/ttyS0
    # do some costly processing on the string
done

问题是它将错过来自串行设备的下一个输入,因为它正在消耗 CPU 周期来执行昂贵的字符串处理。

我想我可以通过使用管道来解决这个问题,原则是 bash 将缓冲两个进程之间的输入:

( while true; do
     read -d$'\n' input_from_serial_device </dev/ttyS0
     echo $input_from_serial_device
  done ) | ( while true; do
     read -t10 input_from_first_process
     # costly string processing
  done )

我首先要检查我是否正确理解了管道,并且这确实会按我的意图缓冲两个进程之间的输入。这个想法正确吗?

其次,如果我在第二个进程中获得了我正在寻找的输入,有没有办法立即杀死这两个进程,而不是从第二个进程退出并在退出第一个进程之前等待下一个输入?

最后,我意识到 bash 并不是做到这一点的最佳方式,而且我目前正在开发一个 C 程序,但我很想把它作为一个中间解决方案。

谢谢!

4

1 回答 1

6

问题不在于管道。是串口设备。

当你写

while true; do
  read -t10 -d$'\n' input_from_serial_device </dev/ttyS0
  # use a lot of time
done

结果是串行设备打开,从中读取一行,然后关闭。然后它不会再次打开,直到# use a lot of time完成。当串行设备未打开时,传入的串行输入将被丢弃。

如果输入的输入速度确实快于处理速度,那么缓冲是不够的。您将不得不丢弃输入。另一方面,如果它以允许处理的平均速度运球,那么您应该能够通过保持串行设备打开来实现您想要的:

while true; do
  read -t10 -r input_from_serial_device
  # process input_from_serial_device
done < /dev/ttyS0

注意:我-r在您的通话中添加了 - 几乎肯定是必要的 -read并删除-d$'\n'了 ,因为这是默认设置。

于 2013-07-23T00:29:17.490 回答