[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