- •Анотація
- •1 Середовище програмування ос unix
- •1.1 Структура ос unix
- •1.2 Створення програми
- •1. Препроцесор
- •2. Транслятор
- •2.1 Компілятор
- •2.2 Асемблер
- •3. Редактор зв'язків(Компонувальником)
- •1.3 Формати об'єктних файлів
- •2 Використання файлової системи unix
- •2.1 Основні поняття
- •2.1.1 Типи та іменування файлів
- •2.1.2 Права доступу до файлів
- •2.1.3 Cистемные структури керування файлами
- •2.1.4 Системні виклики роботи з файлами
- •2.2 Створення та відкриття файлів
- •2.2.1 Системний виклик open
- •2.2.2 Системний виклик create
- •2.2.3 Системний виклик close
- •2.3 Читання та зипис в файл
- •2.3.1 Системний виклик read
- •2.3.2 Системний виклик write
- •2.4 Позіціонування у файлі
- •2.4.1 Системний виклик lseek
- •2.4.2 Системні виклики pread і pwrite
- •2.4.3 Системні виклики readv і writev
- •2.5 Контрольні операції над файлами
- •2.5.1 Системні виклики stat, fstat і lstat
- •2.5.2 Контроль прав доступу до файлу
- •2.5.3 Функція fcntl
- •2.5.4 Системні виклики truncate і ftruncate
- •2.6 Управління каталогами
- •2.6.1 Створення і видалення
- •2.6.2 Читання каталога
- •2.6.3 Зміна каталога
- •2.7 Управління посиланнями
- •2.7.1 Управління жорсткими посиланнями
- •2.7.2 Управління символічними посиланнями
- •2.7.3 Перейменування файлів і каталогів
- •3 Керування процесами ос unix
- •3.1 Процеси ос unix
- •3.2 Сисвизови створення процесів
- •3.3 Завершення процесу
- •3.4 Взаємодія процесів в ос unix
- •3.5 Сигнали
- •3.5.1 Поняття сигналу
- •3.5.2 Розробка оброблювачів сигналів
- •3.5.3 Генерація сигналів
- •3.5.4 Посилка сигналів іншим процесам
- •3.5.5 Блокування сигналів
- •3.5.6 Очікування сигналу
- •3.6 Трасування процесу.
- •3.7 Канали й fifo-Файли
- •3.7.1 Поняття
- •3.7.2 Створення каналу
- •3.7.3 Створення fifo-Файлів
- •3.8 Семафори
- •3.9 Повідомлення.
- •3.10 Поділювана пам'ять.
- •Література
- •Системне програмування Навчальний посібник
- •65082, Одеса, вул. Дворянська, 1/3
2.6.3 Зміна каталога
int chdir(char * pathname);
pathname - ім'я нового робочого каталога
Функція chdir змінює поточний робочий каталог на каталог, визначуваний по pathname; pathname повинен посилатися на існуючий каталог.
Функція chdir повертає значення 0, якщо робочий каталог успішно змінений. Повертане значення -1 указує на помилку; в цьому випадку errno встановлюється в ENOENT, указуючи, що задане path-имя не може бути знайдене. Помилки не виникають, якщо pathname визначає поточний робочий каталог.
Приклад:
наступного оператора змінює поточний робочий каталог на кореневий
chdir("/"); /* Зауваження: еквівалентно chdir("\")
chdir( ".." ); /* вийти вгору */
void lookdir(char *s, int ас, char **av)
chdir(s)
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»: