[cdev] утилита dd
lenad89
lenad89 на list.ru
Пн Май 3 17:02:34 MSK 2010
> а если они не равны
> получается нужно считывать n-e кол-во блоков в переменную,
> пока не будет равняться или не станет больше того кол-ва байтов
> которые указал пользователь на запись в файл,
> а потом уже записывать в файл
>
> ---------------------
а если они не равны:
если выходной блок меньше (хотя еще нужно смотреть количество байт,
которое вернул read и аргументы conv(см. opengroup)) чем выходной
естественно надо заполнять ( считывать n-e кол-во блоков в выходной
буфер и учитывать, что в выходном буфере может быть остаток с
предыдущего шага).
если прочитали меньше читаем еще, если сколько нужно пишем в файл, если
больше - пишем в файл обрезанный часть(размером с выходной буфер), а
оставшийся часть будет началом следующего выходной буфера
если выходной блок больше (хотя еще нужно смотреть количество байт,
которое вернул read и аргументы conv(см. opengroup)), то записываем в
выходной файл (нужно учитывать, что в выходном буфере может быть еще
остаток с предыдущего шага) размер входного блока div размер выходного
частей блоков,
а остаток в следующий выходной буфер.
если выходной блок равен выходному(по размеру), то просто копируем
весь(или часть, в зависимости от опций).(можно не копировать, а передать
указатель на входной блок).
Еще надо бы на cbs обратить внимание :)
Если бы спецификации opengroup были бы на русском,то я бы точнее
написал, что и как. Так что здесь может быть не все верно, если что
поправят.
p.s:
вместо
if () {
} else {
if() {
}
}
используй
if () {
} else if() {
}
1)зачем fopen, если есть open.(возвращает дескриптор)
int in = open(name,O_RDONLY);//открыть только для чтения
int out = open(name,O_WRONLY);//открыть только для записи
//или другие флаги, смотри man 2 open
2) в условии присваивание, вместо сравнения
input_blocksize=output_blocksize
3) Если не удалось открыть, то нужно программу завершать,а не просто
писать сообщение.
4) while ((n = read(fileno(in), bufin, input_blocksize)) > 0) {
write(fileno(out), bufout, output_blocksize);
копировать из bufin в bufout забыл, т.е. записал в out мусор.
5) stat может завершиться ошибкой.
6) а для bs, ibs, obs, cbs аргумент может быть не только числом, так что
придется писать свою функцию , которая возвращает размер блока.
(-_0)
Подробная информация о списке рассылки cdev