Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП теория 4 семестра - методичка слайдов Бранцевич Петр Юльянович 2009.doc
Скачиваний:
160
Добавлен:
15.06.2014
Размер:
1.75 Mб
Скачать

2.5 Файловый ввод/вывод

Перед тем как выполнять операцию чтения или записи в файл, его необходимо открыть. Ядро ОС ведет списки открытых файлов для всех процессов. Эти списки называют таблицами файлов (file table). Они индексируются при помощи неотрицательных целых значений, называемых файловыми дескрипторами (file descriptor, fd). Каждая запись в списке содержит информацию об открытом файле, включая указатель на находящуюся в памяти копию индексного дескриптора (inode) и связанные метаданные: позицию в файле и режимы доступа. Пользовательское пространство и пространство ядра ОС использует файловые дескрипторы в качестве уникальных для каждого процесса маркеров. При открытии файла возвращается файловый дескриптор (точнее номер), а последующие операторы над файлом принимают файловый дескриптор как основной аргумент.

Файловые дескрипторы представляются типом int. У каждого процесса есть максимальное число файлов, которое он может открыть. Номер файлового дескриптора начинается с 0. По умолчанию максимальное число файлов, которое может открыть процесс, 1024. Таким образом, значения файловых дескрипторов колеблются в пределах 0..1023.

Каждый процесс при создании имеет по крайней мере три открытых дескриптора: 0, 1, 2, которые определяют соответственно стандартный ввод (standart in, stdin), стандартный вывод (standart out, stdout) и дескриптор стандартного вывода ошибочных ситуаций (standart error, stderr):

STDIN_FILEND – 0

STDOUT_FILEND – 1

STDERR_FILEND – 2

Файловые дескрипторы могут ссылаться не только на обычные файлы. Они также используются и для доступа к файлам устройств, каталогам, именованным конвейерам (FIFO-файлам), сокетам (socket) и др.

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

Для начала работы с файлом его необходимо открыть. Для этого существует специальный системный вызов open:

#include <sys/types.h>

#include <sys/stat.h>

#include <fentl.h>

int open(const char *name, int flags);

int open(const char *name, int flags, mode_l mode);

Данный системный вызов использует первый параметр name как полный путь к файлу и сопоставляет с этим именем дескриптор файла, который возвращается при успешном завершении операции. Позиция в файле устанавливается в 0, а разрешение на доступ к файлу определяется вторым параметром flags. Он может принимать следующие значения:

O_RDONLY – только для чтения

O_WRONLY – только для записи

O_RDWR – и чтение, и запись

Пример использования системного вызова с проверкой:

int fd;

fd=open(“/home/stud/file1”,O_RDONLY);

if (fd==-1)

{ //обработка ошибки }

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

Также есть и дополнительные флаги, которые могут присоединяться операцией ИЛИ с основными:

O_APPEND – файл открыт в режиме присоединения, перед каждой записью указатель позиции устанавливается в конец файла;

O_CREAT – если файл name не существует, то он создается, если же файл существует и помимо CREAT используется EXCL, то open завершается с ошибкой (возвращается -1);

O_EXCL – этот флаг совместно с CREAT используется для предотвращения повторного создания файла;

O_SYNC – файл открывается для синхронного ввода/вывода, при этом ни одна операция записи не будет завершена, пока данные физически не будут записаны на диск;

O_NONBLOCK – файл открывается в режиме без блокировки, если это возможно. Т.е. ни вызов open, ни любые другие вызовы не приводят к блокировке (засыпанию) процесса во время ввода-вывода. Флаг определен только для конвейеров FIFO;

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

Примером использования системного вызова open с некоторыми из выше перечисленных флагов:

fd=open(“/home/stud/file.rot”, O_WRONLY|O_TRUNC);

Владельцем нового файла становится владелец EUID процесса, создавшего файл.