这两个数字分别对dd的“ a + b记录”统计信息意味着什么?


16

dd统计信息的前两行具有以下格式:

a+b records in
c+d records out

为什么2个数值?这个加号是什么意思?通常是a+0,但是有时当我使用更大的块大小时,dd打印0+b records out

Answers:


16

这意味着该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


10

0+b records out对于b>1通常同时从管或其它源不能提供阅读残缺读取bs=X数据的速度不够快。您可以使用强制dd等待完整的数据块iflag=fullblock。如果您还使用了此选项,则此选项特别有用,count=X因为count也可以计数不完整的块,因此如果不使用fullblock则不可靠...


4

有许多标准命令行实用程序可以挂在描述符上并等待输入。它们几乎都是这样工作的。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

ddread()每个输入块执行一个。如果试图将文件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

每次ddread(0,&in,64) read回来了短-因为它的标准输入文件描述符没有足够的字节等待它时,它使人们满足其要求。所以dd read()0条完整输入记录和2条短记录。那就是那些报告的意思。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.