Читайте также:
|
|
Тема: «Реализация функций API на уровне ОС»
(2 часа)
При реализации функций API на уровне ОС за их выполнение ответственность несет ОС. Объектный код, выполняющий функции, либо непосредственно входит в состав ОС (или даже ядра ОС), либо поставляется в составе динамически загружаемых библиотек, разработанных для данной ОС. Система программирования ответственна только за то, чтобы организовать интерфейс для вызова этого кода.
В таком варианте результирующая программа обращается непосредственно к ОС. Поэтому достигается наибольшая эффективность выполнения функций API по сравнению со всеми другими вариантами реализации API.
Недостатком организации API по такой схеме является практически полное отсутствие переносимости не только кода результирующей программы, но и кода исходной программы. Программа, созданная для одной архитектуры вычислительной системы, не сможет исполняться на вычислительной системе другой архитектуры даже после того, как ее объектный код будет полностью перестроен. Чаще всего система программирования не сможет выполнить перестроение исходного кода для новой архитектуры вычислительной системы, поскольку многие функции API, ориентированные на определенную ОС, будут в новой архитектуре просто отсутствовать.
Таким образом, в данной схеме для переноса прикладной программы с одной целевой вычислительной системы на другую будет требоваться изменение исходного кода программы.
Переносимости можно было бы добиться, если унифицировать функции API в различных ОС. С учетом корпоративных интересов производителей ОС такое направление их развития представляется практически невозможным. В лучшем случае при приложении определенных организационных усилий удается добиться стандартизации смыслового (семантического) наполнения основных функций API, но не их программного интерфейса.
Хорошо известным примером API такого рода может служить набор функций, предоставляемых пользователю со стороны ОС типа Microsoft Windows – WinAPI (Windows API). Надо сказать, что даже внутри этого корпоративного API существует определенная несогласованность, которая несколько ограничивает переносимость программ между различными ОС типа Windows. Еще одним примером такого API можно считать набор сервисных функций ОС типа MS-DOS, реализованный в виде набора подпрограмм обслуживания программных прерываний.
В современных сложных приложениях часто недостаточно работать с одним файлом – необходимо иметь возможность работать с файловой системой, поддерживающей эти файлы. Хотя С++ предусматривает ряд некоторых структур высокого уровня, помогающих работать с файловыми системами, большинство из них относится к категории интерфейсов экспонируемых (т. е. определенных в качестве доступных) API операционной системы, используемых программистом.
Для работы с файловой системой используются в числе прочих следующие функции API Win32: FindFirstFile(), FindFirstFileEx(), FindNextFile(). Все эти функции работают со структурой WIN32_FIND_DATA. Структура содержит 10 полей:
typedef struct WIN32_FIND_DATA{
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
CHAR cFileName[MAX_PATH];
CHAR cAltenateFileName[14];
}
В таблице 1 приведено детальное описание структуры.
Таблица 1.
элемент | Описание |
dwFileAttributes | Специфицирует атрибуты файлового объекта. Атрибуты, файла описывают, какой разрешен доступ к нему, файл это или каталог и т.д. Этот элемент может содержать одно или несколько значений, описанных в таблице 2. |
ftCreationTime | Содержит структуру FILETIME (64-битное значение, представляющее число 100-наносекундных интервалов, прошедших с 1-го января 1601 г.), специфицирующую время первоначального создания файла операционной системой. Структура имеет 2 элемента DWORD, которые функции Find устанавливают в 0, если файловая система, содержащая файл, не поддерживает этот элемент. |
ftLastAccessTime | Содержит структуру FILETIME, специфицирующую время последнего обращения пользователя к файлу. Как и в случае ftCreationTime, оба ее элемента содержат 0, если файловая система не предусматривает этой информации. |
ftLastWriteTime | Содержит структуру FILETIME, специфицирующую время, когда пользователем или процессом производилась последняя запись в файл. Как и в случае ftCreationTime и ftLastAccessTime, оба ее элемента содержат 0, если файловая система не предусматривает этой информации. |
nFileSizeHigh | Размер файла сохраняется операционной системой в двух значениях DWORD, которые комбинируются в соответствии с формулой (nFileSizeHigh * MAXDWORD) + nFileSizeLow, которая дает полный размер файла. (MAXDWORD обычно р но 232-1.) Данный элемент специфицирует старшую часть paj ла; он равен 0, если только размер файла не больше MAXDW |
nFileSizeLow | Специфицирует младшую часть размера файла. Такая структураиз двух DWORD позволяет файлу иметь размер порядка терабайт. |
dwReserved0, dwReservedl | Зарезервировано корпорацией Microsoft для будущего использования. |
cFileName | Ограниченная нулем строка, содержащая длинное имя файла. Его длина всегда меньше МАХРАТН, системной константы, равной обычно 255 или 260. |
cAlternateFileName | Ограниченная нулем строка, содержащая альтернативное имя. Это имя представлено в классическом формате 8.3 (filename.ext). Используйте этот элемент, если вы не уверены, поддерживает ли каждая функция или система, обращающиеся к файлу, длинные имена. |
Как указано в таблице 1, элемент dwFileAttributes может содержать одно или комбинацию из нескольких значений констант, характеризующих свойства файла. Эти константы перечислены и описаны в таблице 2.
Таблица.2. Значения констант для dwFileAttributes
Константа | Описание |
FILE_ATTRIBUTE_ARCHIVE | Приложение используют данное значение, чтобы пометить файл для резервного копирования или удаления. Всякий раз, когда файл изменяется, Windows устанавливает архивный бит. Когда программа резервного копирования архивирует файл, она сбрасывает данный бит. |
FILE_ATTRIBUTE_COMPRESSED | Для файла атрибут означает, что все данные в нем сжаты, т.е. это файл ZIP или он имеет подобный сжатый формат. Для каталога атрибут означает, что для новых файлов и подкаталогов сжатие выполняется по умолчанию (т.е. операционная система или какое-то инструментальное средство сжимает новые файлы и подкаталоги во время создания) |
FILE_ATTRIBUTE_DIRECTORY | Файловый объект соответствует каталогу или папке, – т.е. это логический объект операционной системы, не содержащий собственных данных, а служащий инструментом для организации других объектов. |
FILE_ATTRIBUTE_HIDDEN | Файл является скрытым, т. е. он не включается в обычный листинг каталога, этот атрибут обычно используется системными, вспомогательными или другими файлами, которые разработчик приложения хочет защитить от случайного обнаружения. |
FILE_ATTRIBUTE_NORMAL | Файл обычный, допускающий чтение/запись, не скрытый и не системный. Короче, это означает, что все другие атрибуты файла не установлены и, таким образом, данное значение действительно только в случае, если используется оно одно. |
FILE_ATTRIBUTE_OFFLINE | Данные файла не являются непосредственно доступными. Показывает, что данные были физически перемещены для внешнего хранения. Этот атрибут используется крайне редко, только в некоторых сетевых средах. |
FILE_ATTRIBUTE_READONLY | Файл допускает только чтение. Приложения могут его читать, но не могут модифицировать или удалить. Приложение, которому требуется это делать, должно либо обнулить сначала данный бит, либо сохранить файл под другим именем. |
FILE_ATTRIBUTE_SYSTEM | Файл является частью операционной системы (например, динамической библиотекой) либо используется исключительно операционной системой (например, ядро операционной системы). Вообще модификация системных файлов – небезопасное занятие, потому что в результате, Windows может начать работать неправильно или даже перестанет загружаться. |
FILE_ATTRIBUTE_TEMPORARY | Файл используется для временного хранения. Этот атрибут присваивается файлу, если он создается функцией tmpfile() или любой из функций Windows для временных файлов, таких, как tmpnam() и _tempnam() Временные файлы, созданные приложением, не являются «стабильными» – они должны быть стерты приложением при завершении. |
Если файл имеет длинное имя, полный его вариант будет находиться в cFileName. API в этом случае возвратит классический (формат 8.3), усеченный его вариант в поле cAlternateFileName. Если операционная сися не поддерживает длинные имена файлов либо в данном случае файл это имя не использует, элемент cAlternateFileName будет пустым, a cFtleName будет содержать имя в формате 8.3. Чтобы получить версию имени _ 8.3, вы можете также вызвать функцию API GetShortPathName(), которая возвращает 12-символьную форматированную строку.
Дата добавления: 2015-07-11; просмотров: 109 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Лабораторная работа №8 | | | Лабораторный практикум |