相关疑难解决方法(0)

为什么从管道读取时 awk 会进行全缓冲

我正在从连接到发送 nmea 字符串的 gps 设备的串行端口读取数据。

一个简单的调用来说明我的观点:

  $ awk '{ print $0 }' /dev/ttyPSC9 
  GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
  $GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
  GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
  $GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
Run Code Online (Sandbox Code Playgroud)

如果我尝试从管道读取,awk 会在将输入发送到 stdout 之前对其进行缓冲。

$ cat /dev/ttyPSC9 | awk '{ print $0 }'
<long pause>
GPGGA,073651.000,6310.1043,N,01436.1539,E,1,07,1.0,340.2,M,33.3,M,,0000*56
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
$GPRMC,073651.000,A,6310.1043,N,01436.1539,E,0.42,163.42,070312,,,A*67
GPGGA,073652.000,6310.1043,N,01436.1540,E,1,07,1.0,339.2,M,33.3,M,,0000*55
$GPGSA,A,3,28,22,09,27,01,19,17,,,,,,2.3,1.0,2.0*39
Run Code Online (Sandbox Code Playgroud)

如何避免缓冲?

编辑:凯尔琼斯建议 cat 正在缓冲它的输出,但这似乎没有发生:

$ strace cat /dev/ttyPSC9 | awk '{ print $0 }'
write(1, "2,"..., 2)                    = 2
read(3, "E"..., 4096)                   = 1
write(1, "E"..., 1)                     = 1
read(3, ",0"..., 4096)                  = 2
Run Code Online (Sandbox Code Playgroud)

当我想到它时:我认为程序在写入终端时使用了行缓冲,而在所有其他情况下使用了“常规缓冲”。那么,为什么 cat 没有缓冲更多呢?串口信号是EOF吗?那为什么 cat 没有被终止呢?

awk tty serial-port

27
推荐指数
3
解决办法
2万
查看次数

标准输入无缓冲

我正在执行一个带有 stdin 重定向的程序:

 $ prog < f
Run Code Online (Sandbox Code Playgroud)

在这种情况下,标准输入被完全缓冲。

有没有技巧可以使它无缓冲或行缓冲?

编辑。

不修改程序源代码(即使用setvbuf())

linux buffer stdin

3
推荐指数
2
解决办法
2494
查看次数

标签 统计

awk ×1

buffer ×1

linux ×1

serial-port ×1

stdin ×1

tty ×1