dd bs=X count=1 读取少于 X 个字节

dd bs=X count=1 读取少于 X 个字节

dd从 GNU coreutils 8.32 开始。

当我跑步{ echo a; sleep 1; echo b; } | dd bs=4 count=1时我得到

a
0+1 records in
0+1 records out
2 bytes copied, 2.0381e-05 s, 98.1 kB/s

ddsleep即使未达到块大小并且没有 ,也会在 期间终止EOF。输出b\n丢失。如果我删除sleep或 ,则不会发生这种情况count=1

man dd找不到任何描述这种行为的内容。

  1. 为什么不dd count=1等到bs到达或EOF遇到?
  2. 怎样才能强制dd等待呢?

答案1

这不是由 dd 的行为引起的,而是操作系统特定的行为引起的。这就是行为由 posix 指定

如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,则返回的值可能小于 nbyte,或者如果文件是管道或 FIFO 或特殊文件并且立即可用的字节少于 nbyte用于阅读。例如,来自与终端关联的文件的 read() 可能会返回一行键入的数据。

当您设置时,bs=4您指示dd一次读取 4 个字节,但这仅意味着它请求每个 4 个字节read()。操作系统返回的次数较少,dd不会再返回,read()除非......

有一个iflag=fullblock命令dd执行多个read()操作来读取整个块。

相关内容