在bash中使用管道缓冲来自串行设备的数据

在bash中使用管道缓冲来自串行设备的数据,bash,serial-port,Bash,Serial Port,我有一个脚本,看起来像: while true; do read -t10 -d$'\n' input_from_serial_device </dev/ttyS0 # do some costly processing on the string done 为true时;做 从串行设备读取-t10-d$'\n'输入\u问题不在于管道。这是串行设备 当你写作时 while true; do read -t10 -d$'\n' input_from_serial_dev

我有一个脚本,看起来像:

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

从串行设备读取-t10-d$'\n'输入\u问题不在于管道。这是串行设备

当你写作时

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

注意:我将
-r
--几乎肯定是必需的--添加到您的
read
调用中,并删除了
-d$'\n'
,因为这是默认值。

我认为您不需要在子shell中运行协作处理(我在没有额外的
()
对的情况下从循环中进行例行读写。)有趣的问题,但是超出了我的经验范围,很难测试(谁还有串行端口!?;-)。祝你好运。管道将缓冲一些数据,但我不知道有多少;这当然取决于系统。例如,Linux的最新版本为命名管道提供了64K缓冲区,因此我假设特殊的“未命名”管道也有类似的情况。我使用Sun4(很久以前)对管道中的可用磁盘空间进行了测试,结果归结为/tmp中的可用磁盘空间。(看看
vi
的打开会话在哪里创建它的工作文件,在某些机器上可能是/var/tmp)。大约在同一时间,我有一位同事试图将一个100MB的文件塞进一个windows管道,我通过对同一个项目的测试知道,windows NT肯定有限制(64K左右)。因此,不同的操作系统和版本(以及许可和配置)可能会影响这一点。最好是设置一些测试,看看会发生什么。祝你好运。对于一个给定的系统,不管管道是什么_如果未声明PIPE_BUF,则为POSIX_PIPE_BUF(cygwin为此显示512)。我的SUSE Linux机箱显示64K。谢谢大家@rici的解决方案一针见血,但我从你的评论中学到了很多关于bash和pipes的知识。非常感谢。谢谢这正是问题所在,这个简单的解决方案解决了所有问题!非常感谢你!
while true; do
  read -t10 -d$'\n' input_from_serial_device </dev/ttyS0
  # use a lot of time
done
while true; do
  read -t10 -r input_from_serial_device
  # process input_from_serial_device
done < /dev/ttyS0