- •Исследование системных вызовов для работы с файлами
- •Содержание
- •1. Цель работы
- •2. Краткие теоретические сведения
- •2.1. Cистемные вызовы
- •2.1.1. Открытие файла, системный вызов open
- •2.1.2. Чтение файла, системный вызов read
- •2.1.2. Запись в файл, системный вызов write
- •2.1.3. Закрытие файла, системный вызов close
- •2.1.4. Создание файла, системный вызов creat
- •2.2. Ошибки при выполнении системных вызовов
- •2.3. Генерация случайных чисел
- •2.4. Пример программы
- •3. Задания на лабораторную работу
- •4. ТехническиЕ средствА для выполнения работы
- •5. Порядок выполнения лабораторной работы
- •6. Содержание отчета о выполнении лабораторной работы
- •7. Порядок защиты работы
- •8. Контрольные вопросы
- •Библиографический список
- •Приложение а (справочное) Текст программы
- •Приложение б (справочное) Результат работы программы
2.1.2. Чтение файла, системный вызов read
Процесс может читать данные, используя дескриптор файла с помощью системного вызова read, как показано на рисунке 2.
#include
<unistd.h>
ssize_t
numread = read(int fd, void *buf, size_t qty);
Рисунок 2 – Системный вызов read
Первым аргументом является дескриптор файла. Во втором аргументе указывается массив символов вашей программы, куда посылаются или откуда берутся данные. Третий аргумент - это количество пересылаемых байтов.
С помощью системного вызова read происходит обращение к ядру для передачи данных из файлового дескриптора fd в массив buf, который находится в пространстве памяти вызывающего процесса.
Ядро выполняет действие по запросу и возвращает информацию о результате выполнения. Если требование не было выполнено, то код возврата равен -1. В противном случае, в качестве возвращаемого значения будет число байт, переданных при чтении.
2.1.2. Запись в файл, системный вызов write
Передача данных в открытый файл производится с помощью системного вызова write , как показано на рисунке 3.
#include
<unistd.h>
ssize_t
result = write(int fd, void *buf, size_t qty);
Рисунок 3 – Системный вызов write
Системный вызов write копирует данные из памяти процесса в файл. Если ядро не может или не хочет копировать данные, то системный вызов write возвращает -1. Если ядро переслало данные в файл, то системный вызов возвращает количество байтов, переданных в файл.
2.1.3. Закрытие файла, системный вызов close
Закрытие файла производится с помощью системного вызова close, как показано на рисунке 4.
#include
<unistd.h> int
result = close(int fd);
Рисунок 4 – Системный вызов close
Системный вызов close отключает соединение, которое было определено с помощью файлового дескриптора fd. При обнаружении ошибки системный вызов close возвращает значение -1.
2.1.4. Создание файла, системный вызов creat
Создание файла производится с помощью системного вызова creat, как показано на рисунке 5.
#include
<fcntl.h> int
fd = creat(char *name,int mode);
Рисунок 5 – Системный вызов creat
Одним из способов создания или перезаписи файла является использование для этого системного вызова creat.
Системный вызов creat эквивалентен open с flags, равными O_CREAT|O_WRONLY|O_TRUNC
Системный вызов открывает файл с именем name на запись. Если до этого не было файла с таким именем, то ядро создает файл. Если же есть файл с таким именем, то ядро уничтожает его содержимое, сокращая его размер до нуля.
Если ядро создает файл, то оно устанавливает разряды прав доступа к файлу в соответствии со значением второго аргумента, который задается при обращении к системному вызову.
Каждый файл имеет собственника и три группы атрибутов доступа к файлу:
- rwx, rwx, rwx (r: чтение w: запись x: исполнение);
- user,group, other (пользователь-собственник, группа к которой принадлежит пользователь, все остальные).
Например, fd = creat(«addressbook», 0644);
Будет создан файл с именем addressbook. Если до этого файл не существовал права будут такими: rw-r--r--. Если же файл с указанным именем существовал, то он становится пустым, а права доступа не меняются. В любом случае через файловый дескриптор fd файл будет открыт только на запись.