Hay docenas de utilidades de línea de comandos estándar que pueden colgarse en un descriptor y esperar la entrada. Así es como funcionan todos. dd
es único en el sentido de que puede mostrarle cómo se ve un descriptor en este momento .
Personalmente, realmente no entiendo la utilidad detrás de la iflag=fullblock
opción GNU . Quiero decir, puede simplemente cat
ingresar su entrada al menos con la misma facilidad y sin tener que preocuparse por el tamaño de los bloques de E / S.
Pero dd
puede tomar parte de una secuencia, y puede hacerlo en read()
/ write()
límites en un sistema razonablemente moderno.
{ ( 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
hace un solo read()
por bloque de entrada. Si el archivo que intenta read()
no tiene tantos datos como ha solicitado, no importa, el que read()
cuenta como un bloque de entrada. Así es como funciona: esa es dd
la utilidad principal.
Cuando ha hecho su trabajo, dd
informa sobre todos los bloques de entrada / salida con los que se ha ocupado. Ejecutando el comando anterior nuevamente, pero esta vez soltando stdout en su lugar ...
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
Cada vez que dd
se read(0,&in,64)
read
volvió corta - debido a su descriptor de archivo de entrada estándar no tenía suficientes bytes esperando a que se cumpla su petición cuando lo hizo. Y así dd
read()
0 registros de entrada completos y 2 cortos. Eso es lo que significan esos informes.