- •Практичне заняття 7
- •Введення
- •Розділи носія інформації (partitions) в unix
- •Логічна структура файлової системи і типи файлів в unix
- •Організація файлу на диску в unix на прикладі файлової системи s5fs. Поняття індексного вузла (inode)
- •Організація директорій (каталогів) в unix
- •Поняття суперблоку
- •Операції над файлами і директоріями
- •Системні виклики і команди для виконання операцій над файлами і директоріями
- •Спеціальні функції для роботи з вмістом директорій
- •Поняття про файли, що відображаються в пам'ять (memory mapped файлах). Системні виклики mmap(), munmap()
- •Аналіз, компіляція і прогін програми для створення memory mapped файлу і запису його вмісту Аналіз, компіляція і прогін програми для створення memory mapped файлу і запису його вмісту
- •Питання до захисту роботи
Логічна структура файлової системи і типи файлів в unix
Ми не даватимемо тут визначення файлу, вважаючи, що інтуїтивне уявлення про файли у вас є, а в лекції 11 (розділ "Введення") було введено поняття про файли, як про іменовані абстрактні об'єкти, що володіють певними властивостями. При цьому в просторі імен файлів одному файлу можуть відповідати декілька імен.
В матеріалах практичних занять 1-2 спрощено мовилося про те, що файли можуть об'єднуватися в директорії, і що файли і директорії організовані в деревовидну структуру. На нинішньому рівні знань ми можемо сформулювати це більш акуратно. В операційній системі UNIX існують файли декількох типів, а саме:
звичайні або регулярні файли;
директорії або каталоги;
файли типа FIFO або іменовані pip'и;
спеціальні файли пристроїв;
сокети (sockets);
спеціальні файли зв'язку (link).
Що таке регулярні файли і директорії, вам винне бути добре відомо з особистого досвіду і з лекцій (лекція 11). Про способи їх відображення в дисковий простір мова піде трохи пізніше. Файли типа FIFO були представлені в практичній роботі 5, коли розглядалася робота з іменованими pip'ами (розділ "Поняття FIFO. Використовування системного виклику mknod() для створення FIFO. Функція mkfifo()"). Файли типу "зв'язок" ми представимо в цьому занятті, коли обговорюватимемо операції над файлами (розділ "Операції над файлами і директоріями") і відповідні їм системні виклики (розділ "Системні виклики і команди для виконання операцій над файлами і директоріями"). Про спеціальні файли пристроїв буде розказано в подальших практичних заняттях.
Файли всіх перерахованих типів логічно з'єднані в ациклічний граф з однонаправленими ребрами, що виходить з дерева в результаті зрощення декількох термінальних вузлів дерева або декількох його нетермінальних вузлів так, щоб одержаний граф не містив циклів. В нетермінальних вузлах такого ациклічного графа (тобто у вузлах, з яких виходять ребра) можуть розташовуватися тільки файли типів "директорія" і "зв'язок". Причому з вузла, в якому розташовується файл типу "зв'язок", може виходити тільки рівно одне ребро. В термінальних вузлах цього ациклічного графа (тобто у вузлах, з яких не виходить ребер) можуть розташовуватися файли будь-яких типів (див. рис. 11–12.1), хоча присутність в термінальному вузлі файлу типу "зв'язок" звичайно говорить про деяке порушення цілісності файлової системи.
Мал. 11-12.1. Приклад графа файлової системи
На відміну від деревовидної структури набору файлів, де імена файлів зв'язувалися з вузлами дерева, в такому ациклічному графі ім'я файлу зв'язується не з вузлом, відповідним файлу, а з вхідним в нього ребром. Ребра, що виходять з вузлів, відповідних файлам типу "зв'язок", є неіменованими. Треба відзначити, що практично у всіх існуючих реалізаціях UNIX-подібних систем у вузол графа, відповідний файлу типу "директорія", не може входити більш одного іменованого ребра, хоча стандарт на операційну систему UNIX і не забороняє цього. Як повне ім'я файлу може використовуватися будь-яке ім'я, що виходить при проходженні по ребрах від кореневого вузла графа (тобто вузла, в який не входить жодне ребро) до вузла, відповідного цьому файлу, по будь-якому шляху за допомогою наступного алгоритму:
Якщо файлу, що цікавить нас, відповідає кореневий вузол, то файл має ім'я "/".
Беремо перше іменоване ребро в дорозі і записуємо його ім'я, якому передуємо символу "/".
Для кожного чергового іменованого ребра в дорозі приписуємо до рядка, що вже вийшов, справа символ "/" і ім'я відповідного ребра.
Повне ім'я є унікальним для всієї файлової системи і однозначно визначає відповідний йому файл.
