Gönderen spec :
- Eğer
bs=exprişlenen belirtilen ve daha dönüşüm için diğer bir sync, noerrorya da notruncistenen, her bir giriş bloğu dönen verilerin ayrı bir çıkış bloğu olarak yazılır; Eğer read()döner bir tam bloğun daha az ve syncdönüşüm belirtilmemişse, elde edilen çıkış bloğu, giriş bloğu ile aynı boyutta olacaktır.
Demek muhtemelen kafan karışıyor. Evet, çünkü ddedilir tasarlanmış varsayılan olarak, kısmi engelleme için read()kısmi 1: s 1 eşleştirilir write()s, ya da başka synckuyruk dolgusu NUL veya boşluk karakter üzerinde d bs=zaman boyutu conv=syncbelirtilir.
Bu şu demektir ddolan (bozulma riski / ağırlık nedeniyle kısmi okuma veya yazma için) kopyalama verisi için kullanılacak güvenli keyfi bir sınırlı edildiği her durumda ancak bir count=argüman, çünkü aksi halde ddolacak mutlu write()aynı büyüklükte bloklar olarak çıkışında girişi tamamen read()geçinceye kadar olanlara read(). Ve hatta bu ihtar tek gerçek olduğunda bs=belirtilen veya obs=edilir değil Spec devletlerde hemen ertesi cümlede olarak, belirtilen:
- Eğer
bs=exprişlenen belirtilen veya daha dönüşüm başka değildir sync, noerrorya da notrunctalep edilir, giriş işlem görecektir ve tam boyutlu çıkış bloklar halinde toplanan girdi sonuna ulaşılıncaya kadar.
Olmadan ibs=ve / veya obs=argümanlar bu önemli olamaz - çünkü ibsve obsvarsayılan olarak aynı boyutta her ikisi de. Ancak, açık alabilirsiniz belirterek girdi ara bellek hakkında farklı boyutlarda biri için ve değil belirterek bs= (o önceliklidir çünkü) .
Örneğin, yaparsanız:
IN| dd ibs=1| OUT
... sonra bir POSIX dd, her bir baytı tek bir çıkış bloğunda toplayarakwrite() 512 baytlık parçalar halinde olacaktır .read()
Aksi takdirde, eğer ...
IN| dd obs=1kx1k| OUT
... bir POSIX bir seferde en fazla 512 bayt ddolacaktır , ancak her megabayt boyutlu çıktı bloğu (çekirdeğin sonuncuya izin veren ve hariç olan - hariç, çünkü bu EOF'dir) girişi tam boyutlu çıktı bloklarına toplayarak .read() write()
Ayrıca, özelliklerinden olsa da:
count=n
- Sadece n giriş bloğunu kopyala .
count=i?bs=blokları eşler ve böylece keyfi bir sınırlamayı ele almak için count=taşınabilir olarak iki ddsaniyeye ihtiyacınız olur . İki dds ile yapmanın en pratik yolu , bir çıktının bir başkasının girişine bağlanmasıdır; bu da bizi orijinal giriş türünden bağımsız olarak özel bir dosyayı okuma / yazma alanına sokar .
Bir IPC borusu [io]bs=, güvenli bir şekilde yapmak için, bu tür değerleri sistemin tanımlanmış PIPE_BUFlimiti dahilinde tutmanız gerektiğini belirtir . POSIX, sistem çekirdeğinin yalnızca içinde read()ve write()içinde PIPE_BUFtanımlandığı şekilde atom atomunu garanti etmesi gerektiğini belirtir limits.h. POSIX garanti PIPE_BUFolması , en azından ...
{_POSIX_PIPE_BUF}
- Bir boruya yazarken atomik olması garanti edilen maksimum bayt sayısı.
- Değer: 512
... (ayrıca varsayılan giriş dd/ çıkış blok büyüklüğü olur ) , ancak gerçek değer genellikle en az 4k'dir. Güncel bir linux sisteminde, varsayılan olarak 64k'dir.
Dolayısıyla, ddsüreçlerinizi ayarlarken bunu üç değere dayalı bir blok faktörü üzerinde yapmalısınız :
- bs = (obs =
PIPE_BUFveya daha az)
- n = okunan toplam bayt sayısı
- sayım = n / bs
Sevmek:
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
ddAranamayan girdileri işlemek için i / ow / ile senkronize etmeniz gerekir . Başka bir deyişle, boru tamponlarını belirginleştirin ve problem olmaktan çıkın. Bunun ddiçin var. Buradaki bilinmeyen miktarın yesarabellek boyutu - ancak bunu başka bir taneyle bilinen bir miktarın üzerine çıkarırsanız dd, az miktarda bilgilendirilmiş bir çarpma dd verilerin kopyalanması için güvenli hale getirebilir (kısmi okuma veya yazma nedeniyle bozulma riski olmadan)count= herhangi bir POSIX sistemindeki herhangi bir isteğe bağlı giriş tipini isteğe bağlı olarak sınırsızken ve bir bayt eksik olmadan bile olsa .
İşte POSIX özelliklerinden bir pasaj :
ibs=expr
- Giriş bloğu boyutunu bayt olarak belirtin (varsayılan 512) .
expr
obs=expr
- Çıkış bloğu boyutunu bayt olarak belirtin (varsayılan 512) .
expr
bs=expr
- İçin hem giriş hem de çıkış bloğu boyutlarını ayarlama
exprbayt yerine geçer ibs=ve obs=. Daha dönüşüm için diğer ise sync, noerrorve notruncbelirtilen her bir giriş bloğu kısa blok yığılmasma neden olmadan tek bir blok olarak çıkışına kopyalanmalıdır.
Ayrıca burada daha iyi anlatılanları da bulacaksınız .