我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
dd
sleep
即使未达到块大小并且没有 ,也会在 期间终止EOF
。输出b\n
丢失。如果我删除sleep
或 ,则不会发生这种情况count=1
。
我man dd
找不到任何描述这种行为的内容。
- 为什么不
dd count=1
等到bs
到达或EOF
遇到? - 怎样才能强制
dd
等待呢?
答案1
这不是由 dd 的行为引起的,而是操作系统特定的行为引起的。这就是行为由 posix 指定。
如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,则返回的值可能小于 nbyte,或者如果文件是管道或 FIFO 或特殊文件并且立即可用的字节少于 nbyte用于阅读。例如,来自与终端关联的文件的 read() 可能会返回一行键入的数据。
当您设置时,bs=4
您指示dd
一次读取 4 个字节,但这仅意味着它请求每个 4 个字节read()
。操作系统返回的次数较少,dd
不会再返回,read()
除非......
有一个iflag=fullblock
命令dd
执行多个read()
操作来读取整个块。