Answers:
这意味着该bs
大小的完整块加上大小小于bs的额外块。
pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1
编辑:弗罗斯特斯的答案提到了另一种生成非完整块的情况。值得一读。另请参阅/unix//a/17357/73443。
有许多标准命令行实用程序可以挂在描述符上并等待输入。它们几乎都是这样工作的。dd
独特之处在于它可以向您显示描述符现在的外观。
我个人并不真正理解GNU iflag=fullblock
选项背后的作用。我的意思是,您cat
至少可以轻松地进行输入,而完全不必担心I / O块的大小。
但是dd
可以占用流的一部分 -并且可以在合理的现代系统上的read()
/ write()
边界处执行。
{ ( sleep 1 #don't write() til dd is definitely setup
printf 123 #write() 3 bytes
printf %-30s\\n 456 #write() 31 bytes
printf you\ there\? #write() 10 bytes
)| dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
od -vtc #show it with octal radices
} 2>/dev/null #drop stderr
0000000 1 2 3 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 4 5 6
0000120 \n \0
0000140 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000200
dd
read()
每个输入块执行一个。如果试图将文件read()
不会有尽可能多的数据,因为它已经要求它并不重要-的一个 read()
数作为一个输入的块。这就是它的工作方式-这是dd
主要的工具。
完成工作后,将dd
报告已处理的所有输入/输出块。再次运行以上命令,但是这次删除stdout。
dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s
每次dd
都read(0,&in,64)
read
回来了短-因为它的标准输入文件描述符没有足够的字节等待它时,它使人们满足其要求。所以dd
read()
0条完整输入记录和2条短记录。那就是那些报告的意思。