[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