답변:
이는 해당 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의 답변은 전체 블록이 아닌 블록을 생성하는 또 다른 사례를 언급합니다. 읽을만한 가치가 있습니다. /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 개의 짧은 레코드입니다. 그것이 그 보고서의 의미입니다.