Упрощенное понятие об устройстве файловой системы в UNIX. Полные и относительные имена файлов
В операционной системе UNIX существуют три базовых понятия: "процесс", "файл" и "пользователь". С понятием "пользователь" мы только что уже столкнулись и будем сталкиваться в дальнейшем при изучении работы операционной системы UNIX. Понятие "процесс" характеризует динамическую сторону происходящего в вычислительной системе, оно будет подробно обсуждаться в лекции 2 и в описании последующих семинаров. Понятие "файл" характеризует статическую сторону вычислительной системы.
Из предыдущего опыта работы с вычислительной техникой вы уже имеете некоторое представление о файле, как об именованном наборе данных, хранящемся где-нибудь на магнитных дисках или лентах. Для нашего сегодняшнего обсуждения нам достаточно такого понимания, чтобы разобраться в том, как организована работа с файлами в операционной системе UNIX. Более подробное рассмотрение понятия "файл" и организации файловых систем для операционных систем в целом будет приведено в лекции 11 и лекции 12, а также на семинарах 11–12, посвященных организации файловых систем в UNIX.
Все файлы, доступные в операционной системе UNIX, как и в уже известных вам операционных системах, объединяются в древовидную логическую структуру. Файлы могут объединяться в каталоги или директории. Не существует файлов, которые не входили бы в состав какой-либо директории. Директории в свою очередь могут входить в состав других директорий. Допускается существование пустых директорий, в которые не входит ни одинфайл, и ни одна другая директория (см. рис. 1–2.1). Среди всех директорий существует только одна директория, которая не входит в состав других директорий – ее принято называть корневой. На настоящем уровне нашего незнания UNIX мы можем заключить, что в файловой системе UNIX присутствует, по крайней мере, два типа файлов: обычные файлы, которые могут содержать тексты программ, исполняемый код, данные и т.д. – их принято называть регулярными файлами, и директории.
Рис. 1-2.1.Пример структуры файловой системы
Каждому файлу (регулярному или директории) должно быть присвоено имя. В различных версиях операционной системы UNIX существуют те или иные ограничения на построение имени файла. В стандарте POSIX на интерфейссистемных вызовов для операционной системы UNIX содержится лишь три явных ограничения:
· Нельзя создавать имена большей длины, чем это предусмотрено операционной системой (для Linux – 255 символов).
· Нельзя использовать символ NUL (не путать с указателем NULL!) – он же символ с нулевым кодом, он же признак конца строки в языке C.
· Нельзя использовать символ '/'.
От себя добавим, что также нежелательно применять символы "звездочка" – "*", "знак вопроса" – "?", "кавычка" – "\"", "апостроф" – "\`", "пробел" – " " и "обратный слэш" – "\\" (символы записаны в нотации символьных констант языка C).
Единственным исключением является корневая директория, которая всегда имеет имя "/". Эта же директория по вполне понятным причинам представляет собой единственный файл, который должен иметь уникальное имя во всей файловой системе. Для всех остальных файлов имена должны быть уникальными только в рамках той директории, в которую они непосредственно входят. Каким же образом отличить два файла с именами "aaa.c", входящими в директории "b" и "d" на рисунке 1–2.1, чтобы было понятно о каком из них идет речь? Здесь на помощь приходит понятие полного имени файла.
Давайте мысленно построим путь от корневой вершины дерева файлов к интересующему нас файлу и выпишем все имена файлов (т.е. узлов дерева), встречающиеся на нашем пути, например, "/ usr b aaa.c". В этой последовательности первым будет всегда стоять имя корневой директории, а последним – имя интересующего нас файла. Отделим имена узлов друг от друга в этой записи не пробелами, а символами "/", за исключением имени корневой директории и следующего за ним имени ( "/usr/b/aaa.c" ). Полученная запись однозначно идентифицирует файл во всей логической конструкции файловой системы. Такая запись и получила названиеполного имени файла.