Подсистема ввода-вывода
Функции ввода-вывода в UNIX задаются в основном с помощью пяти системных вызовов: open, close, read, write и seek.
Открыть файл можно следующей командой:
file_descriptor = open (filejiame. mode)
Здесь mode — режим открытия файла (чтение, запись или то и другое); file_de-scriptor — дескриптор файла, служит для последующих ссылок на данный файл; file_name — имя открываемого файла. Чтение и запись осуществляются командами следующего вида:
after_reading_bytes - read (file_descriptor. buffer, bytes) after_writing_bytes = write (file_descriptor. buffer, bytes)
Здесь bytes — количество байтов, которые должны быть прочитаны или записаны; after_reading_bytes и after_writing_bytes — реально прочитанное и записанное количество байтов соответственно.
При чтении возможны три ситуации, в каждой из которых чтение происходит последовательно:
- если это первое чтение из файла, то оно осуществляется последовательно с самого начала файла;
- если операции чтения предшествовала другая операция чтения из этого файла, то текущая операция предоставит данные, непосредственно следующие за предыдущими;
- если предшествовала операция поиска seek (см. далее), то чтение осуществляется последовательно от точки смещения, указанной в операции seek.
Это же справедливо и по отношению к операции записи в файл. Обратите внимание, что все эти вызовы относятся к последовательному доступу и эффект прямой адресации достигается с помощью команды seek, смещающей текущую позицию файла:
Seek (fi1e_descriptor.di splacement.di splacement_type)
Здесь параметр displacement_type (тип смещения) определяет, является смещение абсолютным или относительным, а также задано оно числом байтов или числом блоков по 512 байт.
Важно заметить, что команда seek исполняется для магнитных дисков так же, как и для магнитных лент, которые нынче уже практически не используются, но во времена появления и становления UNIX-систем были часто используемым устройством.
Чтобы закрыть файл, достаточно выполнить следующую команду:
close (file_descriptor)
Еще три примитива — gtty, stty, stat — позволяют получать и задавать информацию о файлах и терминалах.
Те же самые команды ввода-вывода применяются и к физическим устройствам. В UNIX-системах физические устройства представлены специальными файлами в единой структуре файловой системы. Это означает, что пользователь не может
322________________ Глава 10. Краткий обзор современных операционных систем
написать зависящую от устройств программу, если только эта зависимость не отражена в самом потоке передаваемых данных. Стандартные файлы ввода и вывода, приписываемые пользовательскому терминалу, открывать обычным путем не требуется. Терминал открывается автоматически по команде входа в систему login.
Система ввода-вывода UNIX в отличие от большинства других систем ориентирована на работу скорее с потоком данных, а не с записями. Здесь поток данных (stream)1 — это последовательность байтов, заканчивающаяся разделителем (то есть символом конца потока). Понятие потока данных позволяет проще добиться независимости от устройств и унификации файлов с физическими устройствами и конвейерами. Тем самым пользователь получает гибкость в работе с группами данных, но на него ложатся и дополнительные заботы, поскольку ему приходится писать программы управления данными. Пользователь может при необходимости относительно легко самостоятельно реализовать работу с записями. Чтобы работать с записями фиксированной длины, достаточно просто задавать постоянную длину во всех командах чтения и записи. Для нахождения позиции нужной записи при фиксированной длине записей нужно умножить длину записи на помер записи и выполнить команду seek. Работу с записями переменной длины можно организовать, если разместить в начале каждой записи поле фиксированного размера, содержащее значение длины записи.
Дата добавления: 2016-09-20; просмотров: 594;