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

2.5.2. Ответ: Использование open, read и close

Мы можем использовать эти три системных вызова для извлечения из файла utmp записей о вхождениях в систему. Страницы справочника, касающиеся этих тем, могут быть весьма краткими по содержанию. Эти системные вызовы имеют много опций и достаточно слож­ны в своем поведении, когда они используются в отношении программных каналов, устройств и других источников данных. Основополагающие факторы выделяются и рас­сматриваются далее.

Открытие файла: open

Системный вызов open создает связь между процессом и файлом. Эта связь называется де­скриптором файла и изображается на рисунке 2.3 в виде туннеля от процесса к ядра

Рисунок 2.3

Дескриптор файла - это соединение с файлом.

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

ореn

НАЗНАЧЕНИЕ

Создания связи с файлом

INCLUDE

«include <fcntl.h>

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

int fd = open(char *name, int how)

АРГУМЕНТЫ

name - имя файла

how - 0_RDONLY, 0_WRONLY или 0_RDWR

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

-1 -при ошибке Целое число - при успехе

Для открытия файла необходимо определить имя файла и тип желаемой связи. Существуют три типа связей - соединение для чтения, соединение для записи и соединение ддя \ чтения и записи. В заголовочном файле /usr/includeAcntl.h находятся определения для [ макросов 0_RDONLY, 0_WRONLY и 0_RDWR.

Открытие файлов - это служба ядра. Системный вызов open - это требование, которое выдает ваша программа ядру. Если ядро обнаружит ошибку при обращении к нему, то оно вернет код возврата, равный -1.

Есть несколько видов ошибок. Может случиться, что указанный файл не существует. Файл может существовать, но у вас нет прав доступа на чтение из этого файла. Файл может : находиться в каталоге, к которому у вас нет доступа. В странице документации по систем­ному вызову open приведен список подобного рода ошибок. Способы обработки ошибок будут изучены далее в этой главе.

Что происходит, если файл уже был открыт? То есть что будет в ситуации, когда другой процесс уже работает с файлом? В'Unix не устанавливается запрета на одновременное от­крытие несколькими процессами одного и того же файла. Если бы такое ограничение су­ществовало, то двум различным процессам нельзя было бы запустить одновременно одну и ту же команду who. Если открытие происходит успешно, то ядро возвращает процессу небольшое по значению целое положительное число. Это число называют дескриптором файла, который является по смыслу идентификатором соединения процесса с файлом.

Вы можете одновременно открыть несколько файлов. При этом для каждого соединения будет установлен уникальный дескриптор файла. Ваша программа даже может многократ­но отрыть один и тот же файл. При этом для каждого соединения будет установлен свой дескриптор файла.

Вы можете использовать дескриптор файла для всех операций с установленным соедине­нием.

Чтение данных из файла: read

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

read

НАЗНАЧЕНИЕ

Пересылка qty байт из файлового дескриптора fd в буфер

INCLUDE

#include <unistd.h>

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

ssizej numread = readfint fd, void *buf, sizej qty)

АРГУМЕНТЫ

fd - источник данных

buf - место для сохранения данных

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

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

-1 -при ошибке Целое число - при успехе

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

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

Какового сорта ошибки может фиксировать системный вызов read? Ответ можно найти на странице документации в вашей системе, где приведен перечень ошибок.

Закрытие файла: close

Когда вы прочитали данные или записали данные через файловый дескриптор, то вы мо­жете закрыть его. Системный вызов close представлен такими характеристиками:

close

НАЗНАЧЕНИЕ

Закрытие файла

INCLUDE

«include <unistd.h>

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

int result = closefint fd)

АРГУМЕНТЫ

fd - дескриптор данных

buf - место для сохранения данных

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

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

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

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