Программирование >>  Структура ядра и системные вызовы 

1 ... 20 21 22 [ 23 ] 24 25 26 ... 98


список некоторых библиотечных функций С и соответствующих API ОС UNIX, которыми они пользуются при выполнении своих задач.

Библиотечные функции С

Используемые системные вызовы UNIX

open

read

write

Iseek

close

fopen

fread, fgetc, fscanf, fgets fwrite, fputc, fprintf, fputs fseek, ftell, frewind fclose

6.8. Каталоги

с точки зрения реализации файловой системы, каталог - это файл, содержащий записи. Каждая запись дает информацию о файле, находящемся в этом каталоге. Тип данных записи в UNIX System V и POSIX.l - struct dirent, a в BSD UNIX - struct direct. Содержание записи зависит от реализации, но в системах UNIX и POSIX все они содержат два основных поля: имя файла и номер индексного дескриптора. Назначение каталогов - преобразование имен файлов в соответствующие индексные дескрипторы, с тем чтобы операционная система могла преобразовать любое путевое имя файла в номер индексного дескриптора и найти соответствующую ему запись.

Хотя любое приложение может использовать системные вызовы open, read, write, Iseek и close ддя. манипулирования каталогами, в UNIX и POSIX. 1 определен набор переносимых функций, предназначенных специально для открьггия, просмотра и закрытия каталога. Они создаются на основе системных вызовов open, read, write и close и определяются в заголовке <dirent.h> (в системах, совместимых с UNIX System Vи POSIX.l) или в <sys/dir.h> (в BSD UNIX).

Функция Назначение

opendir Открывает каталог

readdir Читает следующую запись из файпа

closedir Закрывает каталог

rewinddir Устанавливает указатель позиции на начало файла

Функция opendir возвращает указатель типа DIR*, аналогичный указателю FILE* для потокового файла С. Этот указатель применяется в вызовах функций readdir, rewinddir w closedir для определения этого, каким каталогом следует манипулировать.

Кроме упомянутых в UNIX-системах определяются также функции telldir и seekdir, обеспечивающие произвольный доступ к различным записям каталога. Эти функции не относятся к стандарту POSIX.l и аналогичны библиотечным С-функциям ftell и fseek соответственно.

Если процесс добавляет файл в каталог или удаляет его из каталога в то время, как другой процесс открыл файл посредством функции opendir, то в зависимости от реализации ОС этот другой процесс, применив функцию readdir, может увидеть, а может и не увидеть внесенные первым процессом изменения. Однако если последний процесс выполняет функцию rewinddir и затем читает каталог, используя функцию readdir, то, согласно POSIX.l, он должен прочитать самый последний вариант содержимого каталога.

6.9. Жесткие и символические ссылки

Жесткая ссылка - это путевое имя файла в ОС UNIX. Больщинство UNIX-файлов имеют всего одну жесткую ссылку. Однако с помощью команды In пользователи могут создавать дополнительные жесткие ссылки на файлы. Так, новую ссылку /usr/joe/book.new для файла /usr/mary/fun.doc может создать команда:

In /usr/mary/fun.doc /usr/joe/book.new

Пользователи могут обращаться к такой ссылке как к файлу /usr/joe/ book.new или как к файлу /usr/mary/fun.doc.

Символические ссылки могут создаваться тем же способом, что и жесткие ссылки, однако в команде In необходимо указать опцию -s. С учетом сказанного вы можете создать /usr/joe/book.new в качестве символической (а не жесткой) ссылки при помощи следующей команды:

In -S /usr/mary/fun.doc /usr/joe/book.new

Символические и жесткие ссылки используются для обеспечения альтернативных способов обращения к файлам. Пусть, например, вы находрггесь в каталоге /usr/jose/proj/doc и постоянно просматриваете файл /usr/in-clude/sys/unistd.h. Вместо того чтобы при каждом обращении к этому файлу указывать полное путевое тля /usr/include/sys/unistd.h, можно создать ссылку на него:

In /usr/include/sys/unistd.h uniref

С этого момента вы можете обращаться к этому файлу как к unref. Таким образом, ссылки упрощают процесс обращения к файлам.

Команда In отличается от команды ср тем, что последняя создает дубликат файла в другом файле и с другим путевым именем, тогда как In прежде всего создает в каталоге новую запись, позволяющую обращаться к файлу. Например, после выполнения команды

In /usr/jose/abc /usr/mary/xyz

каталоги /usr/jose и /usr/тагу 6yziyT содержать следующее:



Номер

индексного

дескриптора

Имя файла

Номер

индексного

дескриптора

Имя файла

a.out

fun.с

/usr/jose

/usr/mary

Обратите внимание на то, что и /usr/jose/abc, и /usr/mary/xyz ссылаются на один номер индексного дескриптора (201). Таким образом, никаких новых файлов не создано. Если, однако, мы воспользуемся командой In -s или командой ср для создания файла /usr/mary/xyz, то будет создан новый индексный дескриптор, а каталоги /usr/jose и /usr/mary будут выглядеть следующим образом:

Номер индексного

дескриптора Имя файла

Номер индексного

дескриптора Имя файла

a.out

fun. с

/usr/jose

/ usr/mary

Если файл /usr/mary/xyz был создан с помощью команды с;?, то его содержимое идентично содержимому файла /usr/jose/abc и оба файла являются отдельными объектами в файловой системе. Однако если файл /usr/mary/xyz был создан посредством команды In -s, то он содержит только путевое имя /usr/mary/abc.

Таким образом, команда In позволяет экономить место на диске, так как не создает дубликатов файлов. Более того, всякий раз, когда пользователь вносит изменения в файл, они становятся доступными при обращении к этому файлу с использованием любой ссылки на него. Для файлов, созданных с помощью команды ср, это не характерно, поскольку дубликат и оригинал - это разные объекты.

Жесткие ссылки используются во всех версиях UNIX, но им присущ ряд ограничений:

Пользователи не могут создавать жесткие ссылки на каталоги, не обладая правами привилегированного пользователя (root). Цель такого ограничения - воспрепятствовать созданию в файловой системе циклических ссылок. Вот пример циклической ссылки:

In /usr/jose/text/unix link /usr/jose

Если указанная команда выполнена успешно, то всякий раз, когда пользователь выполняет команду Is -R/usr/jose, она входит в бесконечный цикл рекурсивного отображения дерева подкаталогов каталога /usr/jose. UNIX позволяет привилегированному пользователю создавать жесткие ссылки на каталоги, считая, очевидно, что уж он-то таких ошибок совершать не будет.

Пользователи не могут создавать жесткие ссылки на файлы, находящиеся в другой файловой системе, так как жесткая ссылка - это лишь запись в файле каталога, которая обозначает тот же индексный дескриптор, что и исходная ссылка. Поскольку номера индексных дескрипторов уникальны только в пределах файловой системы, то возможна ситуация, когда в разных файловых системах присутствуют индексные дескрипторы с одинаковыми номерами.

Чтобы преодолеть упомянутые ограничения, в BSD UNIX используется система символических ссылок. Символ me екая ссылка позволяет обращаться к файлу в любой файловой системе, потому что содержимое ссылки - это путевое имя, а ядро операционной системы преобразует путевые имена и находит файлы и в локальной, и в удаленной файловых системах. Кроме того, пользователи имеют право создавать символические ссылки на каталоги, так как ядро может обнаруживать циклические ссылки на каталоги, создаваемые символическими ссылками. Поэтому никаких бесконечных циклов при просмотре каталогов не будет. Символические ссылки поддерживаются в UNIX System V.4, но не поддерживаются в POSIX. 1.

Различия между символическими и жесткими ссылками описаны в таблице.

Жесткая ссылка

Символическая ссылка

Не создает нового индексного дескриптора Создает новый индексный дескриптор

Не позволяет привилегированному ноль- Может ссылаться на каталоги зователю ссылаться на каталоги

Не может ссылаться на файлы в других Может ссылаться на файлы в других

файловых системах файловых системах

Увеличивает значение счетчика жестких Не изменяет значение счетчика жест-ссылок соответствующего индексного де- ких ссылок соответствующего индекс-скриптора ного дескриптора



6.10. Заключение

в этой главе описаны различные типы файлов, используемых в файловых системах UNIX и POSIX. Показано, как создаются и применяются разные файлы, освещены общесистемные структуры данных и структуры данных процессов UNIX System V, которые предназначены для манипулирования файлами. Описаны интерфейсы прикладного программирования для файлов. Цель этой главы состоит в ознакомлении читателей с файловыми структурами UNIX, с тем чтобы они поняли, для чего были созданы системные вызовы UNIX и POSIX, как они работают и как могут применяться пользователями.

В следующей главе более подробно описываются API, предназначенные

для работы с файлами UNIX и POSIX.

ГЛАВА


Файловые API операционной системы UNIX

Далее рассказывается о том, как приложения UNIX и POSIX взаимодействуют с файлами. Знакомство с этой главой позволит читателям научиться писать программы, выполняющие следующие функции для файлов любого типа в UNIX- и POSIX-системах:

создание файлов;

открытие файлов; пересылка данных в файлы и из файлов; закрытие файлов;

f* удаление файлов;

запрашивание атрибутов файлов; изменение атрибутов файлов; усечение файлов.

Применение файловых интерфейсов прикладного программирования (API) UNIX и POSIX.l иллюстрируется на примерах программ, в которых реализуются UNIX-команды Is, mv, chmod, chown и touch, использующие эти API. Кроме того, в этой главе определяется класс языка С++, который называется Этот класс наследует все свойства класса fstream языка С++ и содержит ряд новых функций-членов, позволяющих создавать объекты для файлов любого типа, отображать и изменять атрибуты файловых объектов.

Предполагается, что читатели прочли предыдущую главу и ознакомились со структурами файлов UNIX и POSIX. Знание этого материала очень важно для понимания методики использования файловых API, описанных в настоящей главе.

Ч



1 ... 20 21 22 [ 23 ] 24 25 26 ... 98

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика