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

2.6. Проект два: Разработка программы ср (чтение и запись)

В программе who мы только читали из файла. А как можно будет записывать в файл? Для изучения возможности записи в файлы мы разработаем версию Unix команды ср.

2.6.1. Вопрос 1: Что делает команда ср?

Команда ср выполняет копирование файла. Типичное обращение к команде будет таким:

$ ср исходный _файл целевой_файл

Если нет целевого файла, то команда ср создает его. Если целевой файл есть, то команда ср заменяет содержимое этого файла содержимым исходного файла.

2.6.2. Вопрос 2: Как команда ср создает файл и как пишет в него? Создание/транкатенация файла

Один из способов создания файла или перезаписи файла является использование для это­го системного вызова creat. Обобщенные характеристики системного вызова:

creat

НАЗНАЧЕНИЕ

Создание или уничтожение файла

INCLUDE

«include < fcntl.h >

ИСПОЛЬЗОВАНИЕ

int fd = creatfchar 'filename, modej mode)

АРГУМЕНТЫ

filename: имя файла mode: права доступа

КОДЫ ВОЗВРАТА

-1 -при ошибке fd - при успехе

Системный вызов creat открывает файл с именем filename на запись. Если до этого не было файла с таким именем, то ядро создает файл. Если же есть файл с таким именем, то ядро уничтожает его содержимое, сокращая (транкатинируя) его размер до нуля.

Если ядро создает файл, то оно устанавливает разряды прав доступа к файлу в соответст-| вии со значением второго аргумента2, который задается при обращении к системному вы-I зову. Например:

fd = creatf'addressbook", 0644);

Будет создан или транкатенирован файл с именем addressbook. Если до этого файл не существовал, права доступа будут такими: rw-r-r--. (Смотри детали в главе 3.) Если же файл с указанным именем существовал, то он становится пустым, а права доступа не меняются. В любом случае через файловый дескриптор fd файл будет открыт только на запись.

Запись в файл

Передача данных в открытый файл производится с помощью системного вызова write:

write

НАЗНАЧЕНИЕ

Передача данных из памяти в файл

INCLUDE

«include < unistd.h >

ИСПОЛЬЗОВАНИЕ

ssizej result = writefint fd, void *buf, sizej amt)

АРГУМЕНТЫ

fd - файловый дескриптор

buf - массив

amt - количество байт для записи

КОДЫ ВОЗВРАТА

-1 - при ошибке

Количество записанных байт - при успехе

Системный вызов write копирует данные из памяти процесса в файл. Если ядро не может или не хочет копировать данные, то системный вызов write возвращает код -1. Если ядро переслало данные в файл, то системный вызов возвращает в качестве кода возврата ко­личество байтов, переданных в файл.

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