小编Dan*_*und的帖子

为什么从管道读取时 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万
查看次数

为什么检测 U 盘需要这么长时间?

我正在编写一个 initramfs 脚本,并希望尽快检测 U 盘。

当我插入 USB 2.0 记忆棒时,idVendor、idProduct 和 USB 类的检测发生在 100 毫秒内。但是 scsi 子系统直到大约 1 秒后才“附加”,并且在完全识别分区之前还需要 500 毫秒。

我假设驱动程序需要读取分区表以检测分区。为什么需要这么长时间?我不希望 urb 发送/接收时间那么长,也不希望闪存的访问时间花费这么多时间。

我尝试了来自不同供应商的 5 支棒,结果大致相同。

[ 5731.097540] usb 2-1.2: new high-speed USB device number 7 using ehci-pci
[ 5731.195360] usb 2-1.2: New USB device found, idVendor=0951, idProduct=1643
[ 5731.195368] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5731.195372] usb 2-1.2: Product: DataTraveler G3
[ 5731.195376] usb 2-1.2: Manufacturer: Kingston
[ 5731.195379] usb 2-1.2: SerialNumber: 001CC0EC32BCBBB04712022C
[ 5731.196942] …
Run Code Online (Sandbox Code Playgroud)

linux usb scsi usb-drive linux-kernel

7
推荐指数
2
解决办法
2389
查看次数

为什么从两个连接的 pty 读取会导致无限循环?

我想伪造一个用于测试程序的 GSM 调制解调器。我希望程序向我发送 AT 代码并且我可以回复它,有点像VirtualSerialPort。但是由于某种原因,从程序写入的数据被直接写回。

我原以为 socat 创建了两个管道;一个将测试程序的输出发送到我在另一侧连接的任何东西和另一个在另一个方向工作的管道。但是,如果您理解我的意思,数据似乎“在一个管道中循环”。这是TTY 揭开神秘面纱的图片来说明我的观点:

内核中的 Pty 处理

一个简化的复制脚本:

我用以下方法创建了 pty:

(xterm 1)$ socat -d -d -d PTY,link=foo PTY,link=bar
2012/01/18 14:45:01 starting loop with FDs [3,3] and [5,5]
Run Code Online (Sandbox Code Playgroud)

我听取双方的意见:

(xterm 2)$ cat <bar
(xterm 3)$ cat <foo
Run Code Online (Sandbox Code Playgroud)

如果我写几个字符...

(xterm 4)$ echo "..." > foo
Run Code Online (Sandbox Code Playgroud)

.. socat 记录了大量无限来回的流量。

(xterm 1)
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 3 to 5
2012/01/18 14:25:58 …
Run Code Online (Sandbox Code Playgroud)

terminal file-descriptors tty

6
推荐指数
1
解决办法
1079
查看次数

如何从patchwork下载完整的补丁系列?

我要下载补丁系列RFC PATCH 00/26 i.MX5/6 IPUv3 CSI/IC

在拼凑中,我可以访问单个补丁https://patchwork.linuxtv.org/patch/24331/。但是下载 26 个补丁然后一个一个地应用它们变得乏味。有没有办法通过拼凑或其他方式下载完整的补丁系列?

问题如何从邮件列表中获取 linux 内核补丁集?建议 marc.info 和 lkml.org 下载单个补丁,但我想要一次整个系列。我怎么做?

patch git linux-kernel

6
推荐指数
1
解决办法
3967
查看次数

Ctrl-Alt-F1 不适用于 X

我有一个运行 Debian 5.0 的系统,它不响应Ctrl+ Alt+ F#(1-6)

检查Ctrl, Alt,F1F2是否被正确拦截...

$ DISPLAY=:0 xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xe00002 (has no name)
...

$ xev -display :0 -id 0xe00002
KeyPress event, serial 16, synthetic NO, window 0xe00002,
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,

KeyPress event, serial 16, synthetic NO, window 0xe00002,
    state …
Run Code Online (Sandbox Code Playgroud)

linux xorg x11 tty

5
推荐指数
1
解决办法
6458
查看次数

标签 统计

tty ×3

linux ×2

linux-kernel ×2

awk ×1

file-descriptors ×1

git ×1

patch ×1

scsi ×1

serial-port ×1

terminal ×1

usb ×1

usb-drive ×1

x11 ×1

xorg ×1