[cdev] Fwd: Задание dd(1)
Grigoriy A. Sitkarev
sinclair80 на gmail.com
Сб Мар 13 23:56:14 MSK 2010
Приветствую всех.
Есть ряд соображений и небольших подсказок по реализации утилиты dd.
1. Спецификация Open Group говорит что размеры ibs и obs могут
задаваться следующими способами:
а) целое положительное число (получается что размер блока может быть любым).
б) целое положительное число с постфиксом k (например 10k, 10
килобайт) которое должно быть помножено на 1024 чтобы получить размер
блока в байтах.
в) целое положительное число с постфиксом b (например 5b, 5 блоков по
512 байт) которое должно быть помножено на 512 чтобы получить размер
блока в байтах.
г) два или более положительных числа с постфиксами `k' или `b'
разделённых `x', которые требуется перемножить чтобы получить размер
блока в байтах. Это у вас простенький такой интерпретатор-умножитель
должен быть. Например, может быть задан такой аргумент для bs -
"10x1024k" что должно дать 10*1024 килобайт.
На степень двойки помножать очень просто, например чтобы получить
число по множителю 1024 нужно просто сдвинуть целое число на 10 бит
влево.
switch (c) {
case 'k':
bytes <<= 10;
break;
case 'b':
bytes <<= 9;
break;
default:
/* Shouldn't reach. */
break;
}
2. Блоки должны писаться и читаться read(2) и write(2) кусками по ibs,
obs или bs байт. Пространство памяти для буфера чтения/записи очевидно
должно выделяться динамически. Спецификация Open Group определяет
поведение программы в случае если read(2) прочитал блок размера меньше
чем ibs или bs, аналогично если write(2) записал блок не полностью за
один раз, т.е. вернул меньше obs или bs. В секции STDERR указано как
должна вести себя программа и что она должна выводить на стандартный
вывод об ошибках в таком случае.
--
Г.А.
Подробная информация о списке рассылки cdev