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

Билет 21

1. Работа с файлами в ос unix. Системные вызовы (21) – 25

Перед тем как выполнять операцию чтения или записи в файл, его необходимо открыть. Ядро ОС ведет списки открытых файлов для всех процессов. Эти списки называют таблицами файлов (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 <fсntl.h>

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

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

int creat(const char *pathname, mode_t mode);// создание файла

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

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

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

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

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

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

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

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

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

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

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

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

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

#include <unistd.h>

int close(int fd);

close закрывает файловый дескриптор, который после этого не ссылается ни на один файл и может быть использован повторно. Все блокировки, находящиеся на соответствующем файле, снимаются (независимо от того, был ли использован для установки блокировки именно этот файловый дескриптор). Если fd является последней копией какого-либо файлового дескриптора, то ресурсы, связанные с ним, освобождаются; если дескриптор был последней ссылкой на файл, удаленный с помощью unlink, то файл окончательно удаляется.  

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

В тексте программы важную роль играют заголовки файлов. Они содержат описания системных вызовов, библиотечных функций, типов данных, констант, которые могут быть использованы в программе. Большинство файлов содержится в каталогах

/usr/include или /usr/include/sys

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