dd의 “a + b 레코드”통계에서 두 숫자는 각각 무엇을 의미합니까? 2 개의 숫자 값입니까? 이 더하기

dd통계 에서 처음 두 줄의 형식은 다음과 같습니다.

a+b records in
c+d records out

왜 2 개의 숫자 값입니까? 이 더하기 부호는 무엇을 의미합니까? 일반적 a+0으로이지만 때로는 더 큰 블록 크기를 사용하면 dd 인쇄0+b records out



답변

이는 해당 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참조하십시오 .


답변

0+b records out왜냐하면 b>1파이프 나 bs=X데이터를 충분히 빨리 제공 할 수없는 다른 소스에서 읽는 동안 일반적으로 불완전한 읽기 입니다. 를 dd사용하여 전체 데이터 블록을 강제 로 대기 할 수 있습니다 iflag=fullblock. 이 옵션은 count=X카운트로 도 사용 하고 불완전한 블록을 계산 하여 전체 블록이 없으면 신뢰할 수없는 경우 특히 유용합니다 …


답변

디스크립터에 매달리고 입력을 기다릴 수있는 수십 가지 표준 명령 행 유틸리티가 있습니다. 그것이 모두 작동하는 방식과 거의 같습니다. 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

때마다 dd않았다 read(0,&in,64) read짧은 돌아왔다 – 표준 입력 파일 기술자가 그것을 만들 때 그것의 요청을 이행하기 위해 충분한 바이트가 대기하지 않았기 때문에. 따라서 dd read()0 개의 전체 입력 레코드와 2 개의 짧은 레코드입니다. 그것이 그 보고서의 의미입니다.


답변