我正在从连接到发送 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 没有被终止呢?
我正在执行一个带有 stdin 重定向的程序:
$ prog < f
Run Code Online (Sandbox Code Playgroud)
在这种情况下,标准输入被完全缓冲。
有没有技巧可以使它无缓冲或行缓冲?
编辑。
不修改程序源代码(即使用setvbuf())