dd 的“a+b 记录”统计中这两个数字分别代表什么意思?

dd 的“a+b 记录”统计中这两个数字分别代表什么意思?

stats中的前 2 行dd具有以下格式:

a+b records in
c+d records out

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

答案1

它意味着该大小的完整块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

编辑:frostschutz的回答提到了另一种生成非完整块的情况。值得一读。也可以看看https://unix.stackexchange.com/a/17357/73443

答案2

0+b records outb>1从管道或其他无法bs=X足够快地提供数据的源读取时,通常是不完整的读取。您可以dd使用强制等待完整的数据块iflag=fullblock。如果您还使用count=X计数也计算不完整的块,则此选项特别有用,因此如果没有完整块,它是不可靠的...

答案3

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

相关内容