ddadalah dirancang untuk memblokir - biasanya alat terbaik yang Anda inginkan untuk membaca dari input berukuran variabel jika Anda membutuhkannya dilakukan segera karena ddtidak akan buffer saat membaca ke dalam beberapa masa depan write() (kecuali jika Anda sangat eksplisit mengkonfigurasinya seperti itu dengan obs lebih besar dari IBS) , tetapi akan sebaliknya write()semua yang dibacanya segera setelah read()itu (dan secara opsional memprosesnya) .
Berikut ini beberapa definisi penting :
ibs=expr
- Tentukan ukuran blok input, dalam bytes, oleh (standarnya adalah 512) .
expr
obs=expr
- Tentukan ukuran blok output, dalam bytes, oleh (standarnya adalah 512) .
expr
bs=expr
- Atur ukuran blok input dan output ke
exprbyte, menggantikan ibs=dan obs=. Jika tidak ada konversi selain sync,, noerrordan notruncditentukan, setiap blok input harus disalin ke output sebagai satu blok tanpa mengagregasi blok pendek.
Jadi Anda lihat, ketika ibsdan obsdidefinisikan bersama sebagai bsmaka ibsdiutamakan - tetapi sebaliknya, jika Anda tertentu, maka baik obsatau cbstidak.
Berikut adalah contoh yang ibspaling penting. Anda mungkin melakukan sesuatu seperti ini jika Anda ingin melacak seberapa cepat /dev/randomkolam diisi ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Asalkan if=target dapat dibaca sama sekali, itu akan selalu menghasilkan file output berukuran sama, karena ddakan synchronize blok read-in pada nulls. Dengan kata lain, jika dd read()s untuk input-blok $((size=10)) $((count=5))kali dan read()file mengembalikan 2 byte, lalu 8 byte, lalu 12 byte, lalu 2 byte, maka 4 byte, ddakan menulis ke sesuatu yang lebih besar dari file seperti
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... karena dd, secara default, tidak menunda. Jadi, jika Anda perlu melacak streaming dan membatasi penulisan beberapa proses lainnya, ddadalah alat untuk Anda.
Jika Anda hanya menulis sejumlah data ke file biasa, berlawanan dengan pernyataan lain yang dibuat di sini, Anda juga dapat menggunakan ddini - dan cukup mudah - tetapi Anda akan membutuhkan lebih dari satu dan faktor pemblokiran yang andal .
Misalnya, jika Anda melakukannya:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... yang pertama ddakan buffer sebanyak mungkin ibs="$size"blok input yang diperlukan untuk mengisi setidaknya satu obs="${size}x$block_factor"blok output untuk setiap write()ke pipa di antara itu dan yang kedua dd. Ini berarti bahwa yang kedua dddapat membatasi output dengan andal count="$lmt"karena semua write()s yang pertama dibuat akan cocok dengan blokir i / o - terlepas dari berapa banyak read()yang pertama ddharus dilakukan untuk membuatnya jadi.
Dan itulah cara yang dapat Anda gunakan dduntuk secara andal membaca pipa atau jenis file khusus lainnya - hanya dengan sedikit matematika.
/dev/randomakan memblokir jika tidak ada cukup entropi yang tersedia untuk menghasilkan jumlah digit yang Anda inginkan. hanya perlu waktu untuk mengumpulkan jumlah "acak" acak psuedo acak berkualitas tinggi ... Baik gunakan/dev/urandomuntuk nilai "acak" yang kurang acak, atau periksa kumpulan entropi Anda (dalam satu lingkaran, dan tunggu seperlunya) ...