Подсистема ввода/вывода
Функции ввода/вывода в UNIX задаются в основном с помощью пяти системных вызовов, а именно: open, close, read, write и seek.
Открыть файл можно командой
file_descriptor = open (file_name, mode)
где параметр mode (режим) указывает, разрешено ли чтение, запись или и то и другое; file_descriptor – дескриптор файла, служит для последующих ссылок на данный файл.
Чтение и запись осуществляется командами следующего вида:
after_reading_bytes = read (fne_descriptor, buffer, bytes)
after_writing_bytes = write (file_descriptor, buffer, bytes)
где bytes – это число байтов, которые должны быть прочитаны или записаны;
after_reading_bytes и after_writing_bytes – это реально прочитанное и записанное количество байтов соответственно.
При чтении возможны три ситуации, в каждой из которых чтение происходит последовательно:
¨ если это первое чтение из файла, то оно осуществляется последовательно с самого начала файла;
¨ если операции чтения предшествовала другая операция чтения из этого файла, то текущая операция предоставит нам данные, непосредственно следующие за предыдущими;
¨ если предшествовала операция поиска seek (см. далее), то чтение осуществляется последовательно от точки смещения, указанной в операции seek.
Это же справедливо и по отношению к операции записи в файл. Обратите внимание, что все эти вызовы относятся к последовательному доступу и эффект прямой адресации достигается с помощью команды seek, смещающей текущую позицию файла
Seek (fiIe_descriptor, displacement, displacement_type).
Здесь параметр displacement_type (тип смещения) определяет в команде, является ли смещение абсолютным или относительным, а также задано ли оно числом байтов или числом блоков по 512 байт.
Важно заметить, что команда seek исполняется для магнитных дисков так же, как и для магнитных лент, которые нынче уже практически не используются, но во времена появления и становления UNIX-систем были часто используемым устройством.
Чтобы закрыть файл, достаточно выполнить команду
close (file_descnptor)
Еще три примитива – gtty, stty, stat позволяют получать и задавать информацию о файлах и терминалах.
Те же самые команды ввода/вывода применяются и к физическим устройствам. В системе UNIX физические устройства представлены специальными файлами в единой структуре файловой системы. Это означает, что пользователь не может написать зависящую от устройств программу, если только эта зависимость не отражена в самом потоке передаваемых данных. Стандартные файлы ввода и вывода, приписываемые пользовательскому терминалу, открывать обычным путем не требуется. Терминал открывается автоматически по команде входа в систему – login.
Система ввода/вывода UNIX, в отличие от большинства других систем, ориентирована скорее на работу с потоком, а не с записями. Здесь поток (stream) – это последовательность байтов, заканчивающаяся разделителем (то есть символом конца потока end-of-stream). Понятие потока позволяет проще добиться независимости от устройств и унификации файлов с физическими устройствами и транспортерами (конвейерами). Тем самым пользователь получает гибкость в работе с группами данных, но на него ложатся и дополнительные заботы, поскольку ему приходится писать программы управления данными. Пользователь может при необходимости относительно легко самостоятельно реализовать работу с записями. Чтобы работать с записями фиксированной длины, достаточно просто задавать постоянную длину во всех командах чтения и записи. Прямой доступ при фиксированной длине записей получается путем умножения длины записи на номер записи и выполнения команды seek для нахождения позиций нужной записи. Работу с записями переменной длины можно организовать, если разместить в начале каждой записи поле фиксированного размера, содержащее длину записи.
Дата добавления: 2022-02-05; просмотров: 265;