Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr3.doc
Скачиваний:
2
Добавлен:
08.11.2019
Размер:
99.84 Кб
Скачать

3.1.2. Чтение данных из файла: системный вызов read

Процесс может читать данные, используя дескриптор файла.

Основные свойства системного вызова read:

#include <unistd.h>

ssize_t numread = read(int fd, void *buf, size_t qty)

Первым аргументом является дескриптор файла. Во втором аргументе указывается массив символов вашей программы, куда посылаются или откуда берутся данные. Третий аргумент - это количество пересылаемых байтов.

С помощью системного вызова read происходит обращение к ядру для передачи данных из файлового дескриптора fd в массив buf, который находится в пространстве памяти вызывающего процесса. Ядро выполняет действие по запросу и возвращает информацию о результате выполнения. Если требование не было выполнено, то код возврата равен -1. В противном случае, в качестве возвращаемого значения будет число байт, переданных при чтении.

3.1.3. Запись в файл: системный вызов write

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

#include <unistd.h>

ssize_t result = write(int fd, void *buf, size_t qty)

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

3.1.4. Закрытие файла: системный вызов close

#include <unistd.h>

int result = close(int fd);

Системный вызов close отключает соединение, которое было определено с помощью файлового дескриптора fd. При обнаружении ошибки системный вызов close возвращает значение -1.

3.1.5. Создание файла: системный вызов creat

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

creat эквивалентен open с flags, равными O_CREAT|O_WRONLY|O_TRUNC

#include <fcntl.h>

int fd = creat(char *name,int mode);

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

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

Каждый файл имеет собственника и три группы атрибутов доступа к файлу:

rwx rwx rwx (r: чтение w: запись x: исполнение)

user group other (пользователь-собственник, группа_к_которой_принадлежит_польз-ль, все остальные)

Например,

fd = creat(«addressbook», 0644);

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

3.2. Ошибки при выполнении системных вызовов

Ядро оповещает вашу программу при возникновении ошибки с помощью определенного кода ошибки. Функция

#include <stdio.h>

void perror(char *s);

узнает у ядра код ошибки и выводит в соответствии с возникшей стандартной ошибкой строку, которую вы ей передаете, вместе с кратким сообщением об ошибке.

Пример:

if ((file = open(DB_PATH, O_RDONLY))<0)

{

perror(«не удается открыть файл базы данных»);

}

Выведется:

не удается открыть файл базы данных: No such file or directory

Код ошибки записывается в переменную errno из <errno.h>. Это переменная типа int, значение которой устанавливается равным положительному номеру ошибки различными библиотечными функциями.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]