
- •Практичне заняття 7
- •Введення
- •Розділи носія інформації (partitions) в unix
- •Логічна структура файлової системи і типи файлів в unix
- •Організація файлу на диску в unix на прикладі файлової системи s5fs. Поняття індексного вузла (inode)
- •Організація директорій (каталогів) в unix
- •Поняття суперблоку
- •Операції над файлами і директоріями
- •Системні виклики і команди для виконання операцій над файлами і директоріями
- •Спеціальні функції для роботи з вмістом директорій
- •Поняття про файли, що відображаються в пам'ять (memory mapped файлах). Системні виклики mmap(), munmap()
- •Аналіз, компіляція і прогін програми для створення memory mapped файлу і запису його вмісту Аналіз, компіляція і прогін програми для створення memory mapped файлу і запису його вмісту
- •Питання до захисту роботи
Спеціальні функції для роботи з вмістом директорій
Стандартні системні виклики open(), read() і close() не можуть допомогти програмісту вивчити вміст файлу типу "директорія". Для аналізу вмісту директорій використовується набір функцій із стандартної бібліотеки мови С.
Функція opendir()
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(char *name);
Опис функції
Функція opendir служить для відкриття потоку інформації для директорії, ім'я якої розташовано по покажчику name. Тип даних DIR є деякою структурою даних, що описує такий потік. Функція opendir готує грунт для функціонування інших функцій, що виконують операції над директорією, і позиціонує потік на першому записі директорії.
Значення, що повертається
При вдалому завершенні функція повертає покажчик на відкритий потік директорії, який надалі передаватиметься як параметр всім іншим функціям, що працюють з цією директорією. При невдалому завершенні повертається значення NULL.
З погляду програміста в цьому інтерфейсі директорія представляється як файл послідовного доступу, над яким можна скоювати операції читання чергового запису і позиціонування на початку файлу. Перед виконанням цих операцій директорію необхідно відкрити, а після закінчення – закрити. Для відкриття директорії використовується функція opendir(), яка готує грунт для здійснення операцій і позиціонує нас на початку файлу. Читання чергового запису з директорії здійснює функція readdir(), одночасно позиціонуючи нас на початку наступного запису (якщо вона, звичайно, існує). Для операції нового позиціонування на початку директорії (якщо раптом знадобиться) застосовується функція rewinddir(). Після закінчення роботи з директорією її необхідно закрити за допомогою функції closedir().
Функція readdir()
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dir);
Опис функції
Функція readdir служить для читання чергового запису з потоку інформації для директорії.
Параметр dir є покажчиком на структуру, що описує потік директорії, який повернула функція opendir().
Тип даних struct dirent є деякою структурою даних, що описує один запис в директорії. Поля цього запису сильно варіюються від однієї файлової системи до іншої, але одне з полів, яке власне і буде нас цікавити, завжди присутнє в ній. Це поле char d_name[ ] невизначеної довжини, що не перевищує значення NAME_MAX+1, яке містить символьне ім'я файлу, що завершується символом кінця рядка. Дані, що повертаються функцією readdir, переписуються при черговому виклику цієї функції для того ж самого потоку директорії.
Значення, що повертається
При вдалому завершенні функція повертає покажчик на структуру, що містить черговий запис директорії. При невдалому завершенні або досягши кінця директорії повертається значення NULL.
Функція rewinddir()
#include <sys/types.h>
#include <dirent.h>
void rewinddir(DIR *dir);
Опис функції
Функція rewinddir служить для позиціонування потоку інформації для директорії, асоційованого з покажчиком dir (тобто з тим, що повернула функція opendir()), на першому записі (або на початку) директорії.
Функція closedir()
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dir);
Опис функції
Функція closedir служить для закриття потоку інформації для директорії, асоційованого з покажчиком dir (тобто з тим, що повернула функція opendir()). Після закриття потік директорії стає неприступним для подальшого використовування.
Значення, що повертається
При успішному завершенні функція повертає значення 0, при невдалому завершенні – значення -1.