Dari spec :
- Jika
bs=exproperan ditentukan dan tidak ada konversi selain sync,, noerroratau notruncdiminta, data yang dikembalikan dari setiap blok input harus ditulis sebagai blok output terpisah; jika read()pengembalian kurang dari blok penuh dan synckonversi tidak ditentukan, blok output yang dihasilkan harus sama dengan blok input.
Jadi ini mungkin yang menyebabkan kebingungan Anda. Ya, karena ddini dirancang untuk memblokir, secara default parsial read()s akan dipetakan 1: 1 sampai parsial write()s, atau syncd pada ekor bantalan NUL atau karakter ruang untuk bs=ukuran ketika conv=syncditentukan.
Ini berarti bahwa ddadalah aman digunakan untuk menyalin data (w / tidak ada risiko korupsi karena membaca sebagian atau write) di setiap kasus tapi satu di mana ia sewenang-wenang dibatasi oleh count=argumen, karena jika tidak ddakan dengan senang hati write()output dalam blok berukuran identik untuk mereka yang inputnya read()sampai read()benar-benar melewatinya. Dan bahkan peringatan ini hanya berlaku bila bs=ditentukan atau obs=yang tidak ditentukan, sebagai kalimat berikutnya di negara-negara spesifikasi:
- Jika
bs=exproperan tidak ditentukan, atau konversi selain sync,, noerroratau notruncdiminta, input harus diproses dan dikumpulkan ke dalam blok output berukuran penuh sampai akhir input tercapai.
Tanpa ibs=dan / atau obs=argumen ini tidak masalah - karena ibsdan obskeduanya berukuran sama secara default. Namun, Anda bisa mendapatkan secara eksplisit tentang buffer input dengan menentukan ukuran yang berbeda untuk salah satu dan tidak menentukan bs= (karena itu diutamakan) .
Misalnya, jika Anda melakukannya:
IN| dd ibs=1| OUT
... maka POSIX ddakan write()dalam potongan 512 byte dengan mengumpulkan setiap read()byte tunggal ke dalam satu blok output.
Jika tidak, jika Anda ...
IN| dd obs=1kx1k| OUT
... POSIX ddakan read() maksimal 512 byte pada satu waktu, tetapi write()setiap blok output berukuran megabyte (kernel memungkinkan dan mengecualikan yang terakhir - karena EOF) secara penuh dengan mengumpulkan input ke dalam blok output berukuran penuh .
Juga dari spec, meskipun:
count=n
- Salin hanya n blok input.
count=peta ke i?bs=blok, dan untuk menangani batas sewenang-wenang count=portable Anda akan membutuhkan dua dds. Cara paling praktis untuk melakukannya dengan dua dds adalah dengan menyalurkan output dari satu ke input yang lain, yang tentunya menempatkan kita dalam bidang membaca / menulis file khusus terlepas dari jenis input asli.
Pipa IPC berarti bahwa ketika menetapkan [io]bs=argumen bahwa, untuk melakukannya dengan aman, Anda harus menyimpan nilai-nilai tersebut dalam PIPE_BUFbatas yang ditentukan sistem . POSIX menyatakan bahwa sistem kernel hanya harus menjamin atom read()dan write()s dalam batas-batas PIPE_BUFsebagaimana didefinisikan dalam limits.h. POSIX menjamin bahwa PIPE_BUFmenjadi setidaknya ...
{_POSIX_PIPE_BUF}
- Jumlah maksimum byte yang dijamin atom saat menulis ke pipa.
- Nilai: 512
... (yang juga merupakan default ddi / o blocksize) , tetapi nilai sebenarnya biasanya setidaknya 4k. Pada sistem linux yang terbaru, secara default, 64k.
Jadi ketika Anda mengatur ddproses Anda, Anda harus melakukannya pada faktor blok berdasarkan pada tiga nilai:
- bs = (obs =
PIPE_BUFatau lebih kecil)
- n = jumlah total byte yang diinginkan yang dibaca
- hitung = n / bs
Suka:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
Anda harus menyinkronkan i / ow / dduntuk menangani input yang tidak dapat dicari. Dengan kata lain, buat penyangga pipa eksplisit dan tidak lagi menjadi masalah. Itu untuk apa dd. Kuantitas yang tidak diketahui di sini adalah yesukuran buffer - tetapi jika Anda memblokirnya ke kuantitas yang diketahui dengan yang lain, ddmaka penggandaan informasi yang sedikit dapat membuat dd aman untuk digunakan untuk menyalin data (tanpa risiko korupsi karena membaca atau menulis sebagian) bahkan ketika secara sewenang-wenang membatasi input w / count=w / sembarang tipe input sembarang pada sistem POSIX dan tanpa melewatkan satu byte pun.
Berikut cuplikan dari spec POSIX :
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.
Anda juga akan menemukan beberapa penjelasan yang lebih baik di sini .