Слайд 2
Файл
сущность, позволяющая получить доступ к какому- либо ресурсу вычислительной̆ системы.
В большинстве
случаев файл определяет именованную область на устройстве хранения данных. В unix-like операционных системах файлом является большинство ресурсов вычислительной̆ системы.
Слайд 3
В UNIX и POSIX- системах существуют следующие типы файлов[]
Обычный̆ файл
Каталог
FIFO-файл
Символическая ссылка
Байт-ориентированный̆ файл устройства
Блок-ориентированный файл устройства.
Слайд 4
Обычный̆ файл может быть тестовым и двоичным. В unix системах эти
типы файлов не различаются и оба могут быть «исполняемыми» при условии, что на них установлено разрешение на выполнение и они могут читаться и записываться пользователем, имеющим соответствующие права доступа.
FIFO-файл является специальным файлом, который̆ предназначен для организации обмена данными между процессами.
Символическая ссылка содержит путевое имя, которое обозначает другой̆ файл в файловой̆ системе.
Каталог содержит файлы и каталоги. Концепция каталога позволяет организовать файлы в некоторую иерархическую структуру. В Unix ситемах базовым является каталог ‘/’.
Слайд 5
Блок-ориентированные файл устройства служит для представления физического устройства, которое передает данные
блоками. Примерами таких устройств являются жесткие диски.
Байт-ориентированный̆ файл устройства служит представления физического устройства, которое передает данные побайтно, например, модем.
Слайд 6
Файловый дескриптор
Информация о файлах, используемых процессом, входит в состав его системного
контекста и хранится в его блоке управления – PCB. В операционной̆ системе UNIX можно упрощенно полагать, что информация о файлах, с которыми процесс осуществляет операции потокового обмена, наряду с информацией̆ о потоковых линиях связи, соединяющих процесс с другими процессами и устройствами ввода-вывода, хранится в некотором массиве, получившем название таблицы открытых файлов или таблицы файловых дескрипторов. Индекс элемента этого массива, соответствующий̆ определенному потоку ввода-вывода, получил название файлового дескриптора для этого потока.
Слайд 7
Дескриптор файла – это индекс открытого файла в таблице дескрипторов файлов.
Файловый̆ дескриптор представляет собой̆ небольшое целое неотрицательное число, которое для текущего процесса в данный̆ момент времени однозначно определяет некоторый̆ действующий̆ канал ввода-вывода. Некоторые файловые дескрипторы на этапе старта любой̆ программы ассоциируются со стандартными потоками ввода-вывода. Файловый̆ дескриптор 0 соответствует стандартному потоку ввода, файловый дескриптор 1 – стандартному потоку вывода, файловый̆ дескриптор 2 – стандартному потоку для вывода ошибок. В нормальном интерактивном режиме работы стандартный̆ поток ввода связывает процесс с клавиатурой̆, а стандартные потоки вывода и вывода ошибок – с текущим терминалом.
Слайд 8
Слайд 9
#include
#include
int open(const char *path_name, int access_mode, mode_t
permission);
Системный̆ вызов open() устанавливает соединение между процессом и файлом. Этот системный̆ вызов позволяет создавать файлы. В случае успешного выполнения функция open() возвращает дескриптор файла. Все другие системные вызовы для работы с файлами используют файловый̆ дескриптор, полученный̆ после выполнения open().
Слайд 10
Параметр access_mode может быть составлен как битовая маска из следующих макросов
● O_RDONLY – открыть файл для чтения;
● O_WRONLY – открыть файл для записи;
● O_RDWR – открыть файл чтения и записи.
Параметр permission – необходим только в том случае, если в access_mode установлен флаг O_CREAT. Он задает права доступа к файлу для его владельца, членов группы и все остальных пользователей̆.
Слайд 11
Каждое из этих значений может быть скомбинировано посредством операции «побитовое или
( | )» с одним или несколькими флагами:
● O_CREAT – создать файл, если файла с таким именем не существует;
● O_EXCL – применяется совместно с флагом O_CREAT. При совместном их использовании и существовании файла с указанным именем, открытие файла не производится и констатируется ошибочная ситуация;
● O_NDELAY – запрещает перевод процесса в состояние ожидание при выполнении операции открытия и любых последующих операциях над этим файлом;
● O_APPEND – при открытии файла и перед выполнением каждой̆ операции записи (если она, конечно, разрешена) указатель текущей̆ позиции в файле устанавливается на конец файла;
● O_TRUNC – если файл существует, уменьшить его размер до 0, с сохранением существующих атрибутов файла, кроме, быть может, времен последнего доступа к файлу и его последней̆ модификации.
Кроме того, в некоторых версиях операционной̆ системы UNIX могут применяться дополнительные значения флагов:
● O_SYNC – любая операция записи в файл будет блокироваться (т. е. процесс будет переведен в состояние ожидание) до тех пор, пока записанная информация не будет физически помещена на соответствующий̆ нижележащий̆ уровень hardware;
● O_NOCTTY – если имя файла относится к терминальному устройству, оно не становится управляющим терминалом процесса, даже если до этого процесс не имел управляющего терминала.
Слайд 12
Параметр permission задается как сумма следующих восьмеричных значений:
● 0400 –
разрешено чтение для пользователя, создавшего файл;
● 0200 – разрешена запись для пользователя, создавшего файл;
● 0100 – разрешено исполнение для пользователя, создавшего файл;
● 0040 – разрешено чтение для группы пользователя, создавшего файл;
● 0020 – разрешена запись для группы пользователя, создавшего файл;
● 0010 – разрешено исполнение для группы пользователя, создавшего
файл;
● 0004 – разрешено чтение для всех остальных пользователей̆;
● 0002 – разрешена запись для всех остальных пользователей̆;
● 0001 – разрешено исполнение для всех остальных
пользователей̆.
Слайд 13
При создании файла реально устанавливаемые права доступа получаются из стандартной̆ комбинации
параметра mode и маски создания файлов текущего процесса umask, а именно – они равны mode & ~umask.
В случае, когда мы требуем, чтобы файл на диске отсутствовал и был создан в момент открытия, флаг для набора операций должен использоваться в комбинации с флагами O_CREAT и O_EXCL.
Слайд 14
Системные вызовы read() и write()
#include
#include
size_t read(int
fd, void *addr, size_t nbytes);
size_t write(int fd, void *addr,size_t nbytes);
Системные вызовы read() и write() предназначены для осуществления потоковых операций ввода (чтения) и вывода (записи) с файлами.
Слайд 15
Параметр fd является файловым дескриптором, полученным с помощью системного вызова open().
Параметр addr представляет собой адрес области памяти, начиная с которого будет браться информация для передачи или размещаться принятая информация.
Параметр nbytes для системного вызова write определяет количество байт, которое должно быть передано, начиная с адреса памяти addr. Параметр nbytes для системного вызова read определяет количество байт, которое мы хотим получить из канала связи и разместить в памяти, начиная с адреса addr.
Слайд 16
Дополнительные системные вызовы
Слайд 17
Блокирующий режим
По умолчанию все файловые дескрипторы в Unix-системах создаются в “блокирующем”
режиме. Это означает, что системные вызовы для ввода-вывода, такие как read, write или connect, могут заблокировать выполнение программы вплоть до готовности результата операции. Например, чтение данных из потока stdin в консольной программе. Как вызывается read для stdin, выполнение программы блокируется, пока данные не будут введены пользователем с клавиатуры и затем прочитаны системой. То же самое происходит при вызове функций стандартной библиотеки, таких как fread, getchar, std::getline, поскольку все они в конечном счёте используют системный вызов read. Если говорить конкретнее, ядро переводит процесс в состояние «Ожидание», пока данные не станут доступны в псевдо-файле stdin. То же самое происходит и для любых других файловых дескрипторов.