Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

2.6.3. Вопрос 3: Могу ли я написать программу ср?

Проверим, насколько было все понятно, путем создания версии программы ср. Схема ра­боты программы будет такой:

открытие исходного файла для чтения

открытие целевого файла на запись

+ -> чтение из исходного файла в буфер -• eof? -+

| _ запись из буфера в файл

закрыть исходный файл <.............+

закрыть целевой файл

На рисунке 2.4 показаны потоки данных при копировании:

Рисунок 2.4

Копирование файлов посредством чтения и записи

Файлы расположены на диске. Исходный файл находится слева на схематическом изобра­жении диска, а целевой файл - справа. Буфер представляет собой область памяти в преде­лах среды процесса. Процесс располагает двумя файловыми дескрипторами. Данные чи­таются из исходного файла в буфер, а затем записываются из буфера в целевой файл.

Наконец, программный код, который соответствует изображению на рисунке, будет та­ким:

/**ср1.с

* версия 1 программы ср - использует read и write при работе с буфером с

* настраиваемым размером

*

* usage: cp1 src dest

*/

include <stdio.n>

#include <unistd.h>

#include <fcntl.h>

#define BUFFERSIZE 4096

#define COPYMODE 0644

void oops(char *, char *);

mainfintac, char*avfj)

(

int in_fd, out fd, n chars;

charbuffBUFFERSIZE];

I* проверка аргументов */

if(ac!=3){

fprintf(stderr, "usage: %s source destination\n", *av);

exit(1);

}

I* открытие файлов */

if ((in_fd=open(av[1], O.RDONLY)) == -1)

oops(“Cannot open", av[1]);

if ((out_fd=creat(av[2], COPYMODE)) == -1}

oopsf'Cannot creat", av[2]);

/* копирование файлов */

while ((n_chars = readfinjd, buf, BUFFERSIZE)) > 0)

if (write(out_fd, buf, n_chars) != nchars)

oops(Write error to", av[2]);

if (n_chars == -1)

oopsf'Read error from ", av[1]);

I* закрытие файлов */

if (close(injd) == -11| close(outjd) == -1)

oops('Error closing files","");

}

void oopsfchar *s1, char *s2)

{

fprintf(stderr,"Error: %s", s1);

perror(s2);

exit(1);

}

Откомпилируем и проверим работу программы:

$ сс ср1.с -оср1

$ ср1 ср1 copy.of.cp1

$ Is -»ср1 copy.of.cp1

-rw-r-r- 1 brucebruce 37419 Jul 23 03:12 copy.of.cp1

-rwxrwxr-x 1 bruce bruce 37419 Jul 23 03:08 cp1

$ cmp cp1 copy.of.cp1

$

С первого взгляда кажется, что все работает. Утилита cmp сравнивает два файла и при об­наружении несовпадения по содержанию оповещает об этом. Поскольку разницы между указанными файлами нет, то нет и сообщения о несовпадении.

А как наша программа будет реагировать на ошибочные ситуации? Сначала попытаемся снять копию с несуществующего файла, а затем записать копию в каталог. Получим такой результат:

$ср1 xxx123 file1

Error: Cannot open xxx123; No such file or directory

$ cp1 cp1 /tmp

Error: Cannot creat Amp: Is a directory

Проверим другие ошибочные ситуации. Следует обратиться к документации по системно­му вызову и посмотреть там, какие ошибки могут возникать при его выполнении. Затем нужно попытаться воспроизвести ошибочные ситуации. При этом проверяйте - не затираете ли вы файлы, с которыми вам будет необходимо работать.