Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

2.6.3 Зміна каталога

int chdir(char * pathname);

pathname - ім'я нового робочого каталога

Функція chdir змінює поточний робочий каталог на каталог, визначуваний по pathname; pathname повинен посилатися на існуючий каталог.

Функція chdir повертає значення 0, якщо робочий каталог успішно змінений. Повертане значення -1 указує на помилку; в цьому випадку errno встановлюється в ENOENT, указуючи, що задане path-имя не може бути знайдене. Помилки не виникають, якщо pathname визначає поточний робочий каталог.

Приклад:

наступного оператора змінює поточний робочий каталог на кореневий

  1. chdir("/"); /* Зауваження: еквівалентно chdir("\")

chdir( ".." ); /* вийти вгору */

  1. void lookdir(char *s, int ас, char **av)

chdir(s)

  1. chdir("c:/temp");

c:\temp

Відмітимо, що ви повинні поміщати два зворотні слеші (\) в C-стрoку, щоб представити одиночний слэш (\). Зворотний слэш - це escape-символ для C-строк і тому вимагає спеціального звернення.

2.7 Управління посиланнями

2.7.1 Управління жорсткими посиланнями

Запис у файлі каталога, що містить ім'я і номер індексного вузла, називається жорстким посиланням. Існує ще один тип посилань — символічні посилання

Жорстке посилання з'являється при створенні файлу будь-якого типу, включаючи каталоги. Можна створити додаткові жорсткі посилання на файли, що не є каталогами, за допомогою системного виклику link:

link — створює жорстке посилання

#include <unistd.h>

int link(const char *oldpath, const char *newpath)

oldpath, старе ім'я файлу

newpath нове ім'я файлу

Повертає 0 у разі успіху-1 у разі помилки (код помилки -в змінної errno)

Перший аргумент (oldpath) повинен бути ім'ям існуючого жорсткого посилання — вона представляє номер використовуваного індексного вузла. Другий аргумент (newpath) задає ім'я нового жорсткого посилання. Старе і нове посилання абсолютно равноправны, оскільки UNIX не розрізняє первинні і вторинні посилання. Процес, що створює жорстке посилання, повинен мати право на запис в каталог, де вона розміщуватиметься. Імені посилання, представленого в другому аргументі, не повинно існувати — системний виклик link не уміє змінювати існуючі посилання. У разі потреби, існуюче посилання повинне бути спочатку видалена викликом unlink.

2.7.2 Управління символічними посиланнями

На відміну від жорсткого посилання, символічне посилання — просто маленький файл, який зберігає рядок повного імені об'єкту в текстовому вигляді. Символічні посилання можуть посилатися на інші символічні посилання. Зазвичай, коли системному виклику open передається символічне посилання такого роду, ядро разыменовывает їх по ланцюжку до тих пір, поки не зустріне об'єкт, який не є символічним посиланням. З жорсткими посиланнями цього не відбувається, тому що вони прямо посилаються на індексний вузол, який не може бути іншим жорстким посиланням (хоча він може бути каталогом, який містить жорстке посилання). Іншими словами, якщо шлях до об'єкту визначається жорстким посиланням, він може розглядатися буквально. Якщо символічним посиланням, то фактичний шлях до об'єкту залежить від вмісту проміжних символічних посилань.

Створюються символічні посилання системним викликом symlink:

symlink — створює символічне посилання

#include <unistd.h>

int symlink(const char *oldpath, const char *newpath)

oldpath, можливе старе повне ім'я

newpath нове повне ім'я

Повертає 0 у разі успіху -1 у разі помилки (код помилки -в змінної errno)

Головним чином, symlink працює аналогічно link. B обох випадках створюється нове жорстке посилання з ім'ям newpath. Проте у разі символічного посилання, це нове жорстке посилання указує на файл символічного посилання, який містить рядок oldpath.

У коментарях до системного виклику використано уточнення — «можливе». Зроблено це тому, що symlink взагалі ніяк не перевіряє коректність аргументу oldpath.

Така особливість символічних посилань закладена в них навмисно — вони можуть посилатися на неіснуючі об'єкти, до яких можна зарахувати об'єкти, що знаходяться в отмонтированных файлових системах.

З іншого боку, подібна незалежність від об'єкту посилання має свої недоліки — ядро нічого не робить з символічним посиланням, коли віддаляється об'єкт посилання (жорсткою).

Видалити символічне посилання можна за допомогою системного виклику unlink.

readlink — читає вміст файлу символічного посилання

#include <unistd.h>

ssize_t readlink(const char *path, char *buf, size_t bufsize)

path - повне ім'я

buf повертаний текст

bufsize розмір буфера;

Повертає 0 у разі успіху -1 у разі помилки (код помилки -в змінної errno)

Системний виклик readlink повертає повне ім'я об'єкту посилання, але без завершуючого символу «0», який в UNIX зазвичай служить маркером кінця рядка. Тому як третій аргумент слід передавати число, на 1 менше фактичного розміру буфера, а після отримання заповненого буфера необхідно додати в нього символ «\0»:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]