
- •050201 «Системная инженерия»
- •1. Цель работы
- •2. Постановка задачи
- •3. Краткие теоретические сведения
- •3.1. Системные вызовы
- •3.1.1. 6Открытие файла: Системный вызов open
- •3.1.2. Чтение данных из файла: системный вызов read
- •3.1.3. Запись в файл: системный вызов write
- •3.1.4. Закрытие файла: системный вызов close
- •3.1.5. Создание файла: системный вызов creat
- •3.2. Ошибки при выполнении системных вызовов
- •3.3. Генерация случайных чисел
- •4. Пример программы
- •5. Контрольные вопросы
- •Приложение а (справочное) Текст программы
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, значение которой устанавливается равным положительному номеру ошибки различными библиотечными функциями.