Tôi đang đọc từ một cổng nối tiếp được kết nối với một thiết bị gps gửi các chuỗi nmea.
Một lời mời đơn giản hóa để minh họa quan điểm của tôi:
$ 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
Thay vào đó, nếu tôi cố gắng đọc từ một đường ống, hãy đánh thức bộ đệm đầu vào trước khi gửi nó đến thiết bị xuất chuẩn.
$ 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
Làm thế nào tôi có thể tránh được bộ đệm?
Chỉnh sửa : Kyle Jones đề xuất rằng con mèo đang đệm đầu ra của nó nhưng điều đó dường như không xảy ra:
$ 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
Khi tôi nghĩ về nó: tôi nghĩ rằng một chương trình đã sử dụng bộ đệm dòng khi ghi vào thiết bị đầu cuối và "bộ đệm thông thường" cho tất cả các trường hợp khác. Vậy thì, tại sao mèo không được đệm nhiều hơn? Là cổng nối tiếp báo hiệu EOF? Vậy thì tại sao mèo không chấm dứt?