- •Введение
- •Понятие операционной системы. Типы операционных систем
- •Функции операционной системы
- •Структура операционной системы. Ос ms dos
- •Файлы и каталоги на дисках
- •Драйверы устройств
- •Базовая система ввода-вывода (bios)
- •Загрузчик операционной системы
- •Ядро ms dos
- •Командный процессор dos
- •Внешние команды dos
- •Файловая структура диска
- •Стартовый сектор
- •Каталоги
- •Область данных
- •Операционные системы Windows
- •Выбор платформы Windows
- •Термины
- •Архитектура Windows Режимы выполнения программного кода
- •Многозадачность
- •Управление памятью в Windows
- •Выполнение приложений
- •Интерфейс прикладного программирования Win32
- •Реестр Windows
- •Операционная система unix
- •Ядро и процессы unix
- •Диспетчер unix
- •Процессы unix
- •Дескриптор и контекст процесса
- •Иерархия процессов
- •Идентификаторы процесса
- •Группы процессов
- •Взаимодействие процессов
- •Процессы-«демоны»
- •Межпроцессные коммуникации unix
- •Сигналы
- •Сигналы unix по мере возрастания их значений:
- •Семафоры
- •Программные каналы (Pipes)
- •Очереди сообщений
- •Разделяемая память
- •Многопользовательская защита в unix
- •Идентификаторы пользователя и группы
- •Код защиты файла
- •Привилегированный пользователь
- •Эффективные и реальные идентификаторы
- •Свопинг и пейджинг в unix
- •Буфер кеш-памяти
- •Управление вводом/выводом
- •Специальные файлы
- •Взаимодействие драйверов с программной и аппаратной средой
- •Файловая система unix
- •Основные системные каталоги
- •Корневой каталог /
- •Каталог /var
- •Каталог /etc
- •Каталог /usr
- •Каталог /home (/export/home)
- •Каталог/opt (/opti, /opt2, ... /optn)
- •Команды управления swap
- •Команда mkfile
- •Специальные файлы
- •Класс устройства
- •Тип и номер
- •Связь физической и логической структур
- •Создание и монтирование файловой системы
- •Дисковые устройства в unix
- •Внутренняя структура файловой системы Распределение дискового пространства
- •Индексные дескрипторы
- •Системные вызовы unix для работы с файлами
- •Стандартные библиотечные функции ввода/вывода
- •Поточные функции ввода/вывода
- •Литература
- •Оглавление
-
Системные вызовы unix для работы с файлами
Основные системные функции, обеспечивающие обращение к уже существующим файлам, - это функции open, read, write, Iseek и close, за ними следуют функции создания новых файлов - creat и mknod - и, наконец, функции для работы с индексом или для передвижения по файловой системе: chdir, chroot, chown, stat и fstat.
9
Как уже отмечалось, система ввода/вывода в UNIX характеризуется прежде всего тем, что программист ничего не обязан знать о физической природе внешних устройств, т.к. он оперирует только с объектами-файлами. С точки зрения прльзователя стирается всякая разница между файлом-устройством и файлом – набором записей, ибо алгоритм работы с ними совершенно один и тот же.
Для тoго, чтoбы укaзaть ядру файл, к которому следует сделать обращение, неoбxoдимo этот фaйл либo открыть (open), либо создать (сгеаte) (рис.9 )
Открытие - это процесс присвоения по имени файла некоторого значения некоторой переменной, хранящейся в области памяти процесса и называемой дескриптором фaйлa. Еcли файл существует, значит, существует и дескриптор, и ссылка по имени успешно разрешена.
Синтаксис вызова функции open: fd = open(pathname,flags,modes);
где pathname - имя файла, flags указывает режим открытия (например, для чтения или записи), a modes содержит права доступак файлу в случае, если файл создается. Системная функция open возвращает целое число (*), именуемое пользовательским дескриптором файла.
Другие операциинад файлами, такйе как чтение, запись, позиционирование головок чтения/записи, воспроизведение дескриптора файла, установка параметров ввода/вывода, определение статуса файла и закрытие файла, используют значение дескриптора файла, возвращаемое системной функцией open.
Create
Системный вызов create создает новый файл или перезаписывает уже существующий. Если файла не существовало, ему присваивается код защиты, указанный в параметре mode. Если файл существовал, его код защиты и имя владельца сохраняются, но длина его обнуляется. Одновременно файл открывается на запись и пользователю возвращается номер дескриптора. Формат вызова create следующий:
create (name,mode)
char *name.
Dup
Системный вызов dup возвращает синоним имеющегося дескриптора открытого файла. Обычно этот вызов используется, когда необходимо переназначить ввод/вывод. Например, стандартный ввод всегда, можно подменить вводом из какого-нибудь файла.
Read
Функция read служит для обмена между памятью процесса и внешним объектом, когда его дескриптор уже получен.
Синтаксис вызова системной функции read (читать):
number = read(fd,buffer,count)
где fd - дескриптор файла, возвращаемый функцией open; buffer - адрес структуры данных в пользовательском процессе., где будут размещаться считанные данные в случае, если успешно завершится выполнение функции read; count - количество байт, которые пользователю нужно прочитать;
number - количество фактически прочитанных байт.
После того, как ядро установит значения параметров ввода/вывода в адресном пространстве процесса, оно обращается к индексу, используя указатель из таблицы файлов, и блокирует его прежде, чем начать чтение из файла.
Затем в алгоритме начинается цикл, выполняющийся до тех пор, пока операция чтения не будет произведена до конца. Ядро преобразовывает смещение в байтах внутри файла в номер блока и вычисляет смещение внутри блока до места, откуда следует начать ввод/вывод, а также количество байт, которые будут прочитаны из блока.
После считывания блока в буфер ядро копирует данные из блока по адресу, установленному в пользовательском процессе. Если запрос пользователя не удовлетворен, ядро повторяет весь цикл, преобразовывая смещение в байтах внутри файла в номер блока, считывая блок с диска в системный буфер, копируя данные из буфера в пользовательский процесс, освобождая буфер и корректируя значения параметров ввода/вывода в адресном пространстве процесса. Цикл завершается либо когда ядро выполнит запрос пользователя полностью, либо когда в файле кончатся данные, либо когда ядро обнаружит ошибку при чтении данных с диска или при копировании данных в пространство пользователя. Ядро корректирует значение смещения в таблице файлов в соответствии с количеством фактически прочитанных байт; поэтому успешное выполнение операций чтения выглядит как последовательное считывание данных из файла.
Write
Синтаксис вызова системной функции write (писать):
number = write(fd,buffer,count);
где переменные fd, buffer, count и number имеют тот же смысл, что и для вызова системной функции read. Алгоритм записи в обычный файл похож на алгоритм чтения из обычного файла, за исключением того, что дескриптор должен быть предварительно создан или файл открыт на дозапись. Практически система не ограничивает длину передаваемой информации, однако при записи на диски и ленты лучше всего работать блоками, поскольку эти операции производятся с большей эффективностью. При обработке символьных данных, когда возникает необходимость принимать и передавать данные из файла в файл по одному символу, можно использовать системные функции getchar и putchar.
В первых версиях UNIX отсутствовал механизм, с помощью которого процесс мог обеспечить себе исключительный доступ к файлу. В последние версии системы были включены механизмы захвата файла и записи. Захват файла - это средство, позволяющее запретить другим процессам производить чтение или запись любой части файла, а захват записи - это средство, позволяющее запретить другим процессам производить ввод/вывод указанных записей (частей файла между указанными смещениями). В версии V системы функция fcntl используется для реализации механизма захвата файла и записи и имеет следующий формат;
fcntl(fd,cmd,arg);
где fd - дескриптор файла; cmd - тип блокирующей операции, а в arg указываются различные параметры, такие, как тип блокировки (записи или чтения) и смещения в байтах
Lseek
Системный вызов Lseek обеспечивает продвижение указателя к нужному месту в файле для осуществления операций ввода/вывода. Синтаксис вызова системной функции:
position = lseek(fd,offset,ptr);
где fd - дескриптор файла, идентифицирующий файл; offset - смещение в байтах, a ptr указывает, является ли значение offset смещением от начала файла - 0, смещением от текущей позиции ввода/вывода - 1 или смещением от, конца файла - 2. Возвращаемое значение, position, является смещением в байтах до места, где будет начинаться следующая операция чтения или записи. Например, процесс может открывать файл, считывать байт, а затем вызывать функцию Iseek, чтобы заменить значение поля смещения в таблице файлов величиной, равной 1023 (с переменной reference, имеющей значение 1), и выполнять цикл. Таким образом, считывается каждый 1024-й байт файла. Если reference имеет значение 0, ядро осуществляет поиск от начала файла, а если 2, ядро ведет поиск от конца файла. Функция Iseek ничего не должна делать, кроме операции поиска, которая позиционирует головку чтения/записи на указанный дисковый сектор. Для того чтобы выполнить функцию Iseek, ядро просто выбирает значение смещения из таблицы файлов; в последующих вызовах функций read и write смещение из таблицы файлов используется в качестве начального смещения.
Close
Формат системного вызова close следующий:
close (fd)
где fd - дескриптор закрываемого файла.
Закрытие файлов, открытых процессом, происходит автоматически при завершении процесса, но, т. к. существует все-таки ограничение на количество открытых одновременно одним процессом файлов, то приходится прибегать к их закрытию, да и не только поэтому. Например, при замене файлов стандартного ввода и вывода используется функция close. Как и всегда в UNIX, код возврата при успешном завершении операции - 0, а при неуспешном - -1.
Unlink
Удаление файла производится при помощи системного вызова unlink. Формат системного вызова unlink следующий:
unlink (name)
char *name;
где name - указатель на строку символов, оканчивающуюся обязательным нулем, где содержится имя удаляемого файла. При этом ссылка на файл из текущего каталога удаляется и, если файл не упоминается в другом каталоге, содержимое его также удаляется.