- •Міністерство освіти і науки України
- •Жуковецька с.Л., Шестопалов с.В.
- •Анотація
- •Введення
- •Лабораторна робота №1 Технологія розробки програм у середовищі Linux
- •1. Команди роботи з командним інтерпретатором ос unix
- •2. Створення програми
- •3. Функції введення-виведення.
- •4. Приклад програми
- •5. Основні керуючі конструкції мови с
- •6. Індівідуальні завдання
- •Лабораторна робота № 2. Автоматизація пакетних завдань
- •1. Компіляція багатомодульною програми
- •2. Автоматизація пакетних завдань
- •4. Завдання
- •Лабораторна робота № 3. Взаємодія програми з середовищем виконання
- •1. Аргументи командного рядка
- •2. Змінні оточення
- •3. Індівідуальні завдання
- •Лабораторна робота №4. Контроль виконання програми
- •1. Коди завершення програми
- •2. Функції обробки значення errno
- •3. Функція atexit()
- •4. Макрос asssert()
- •5. Індівідуальні завдання
- •Лабораторна робота №5 Файлові api.
- •1 Основні поняття
- •2. Права доступу до файлів
- •3. Інтерфейси для файлового введення / виводу
- •4. Системні виклики роботи з файлами
- •5. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №6 Робота з каталогами та посиланнями
- •Методичні вказівки
- •1. Створення та видалення каталогу
- •2. Читання каталогу
- •3. Зміна каталогу
- •4. Управління жорсткими посиланнями
- •5. Управління символічними посиланнями
- •6. Перейменування файлів і каталогів
- •7. Індівідуальні завдання
- •Лабораторна робота №7. Одержання і відображення метаданих файлу.
- •Методичні вказівки
- •1. Механізми управління файлами ос unix
- •2. Отримання даних індексного дескриптору
- •3. Додаткові функції маніпулювання даними індексних дескрипторів
- •4. Отримання даних про відкриті файли
- •5. Індівідуальні завдання
- •Лабораторна робота №8. Керування процесами
- •Методичні вказівки
- •1. Загальні поняття
- •2. Створення поцесу
- •4. Перезавантаження програми процесу
- •5. Завершення виконання процесу
- •6. Системні виклики wait, waitpid
- •7. Індівідуальні завдання
- •Лабораторна робота №9. Використання каналів
- •Методичні вказівки
- •1. Заганьні відомості
- •2. Використання каналів
- •3. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №10 Використання повідомлень
- •Методичні вказівки
- •1. Загальні відомості
- •2. Використання повідомлень
- •3. Індівідуальні завдання
- •Література
- •Системне програмування Посібник до виконання лабораторних та самостійних робіт
- •65082, Одеса, вул. Дворянська, 1/3
6. Перейменування файлів і каталогів
Операція перейменування увазі зміну назви елемента каталогу. Потрібно створити нову жорстку посилання викликом link і видалити стару посилання виклику вом unlink.
Але в цьому випадку виникає ряд проблем:
Файл може бути каталогом, для якого не можна створити другу жорстку посилання.
Перейменований об'єкт може опинитися в іншому каталозі. Якщо це каталог тієї ж файлової системи, то проблем не виникає, але якщо інший, то виникне конфлікт, тому що link може створювати жорсткі посилання тільки в межах однієї файлової системи. Зрозуміло, можна створити символічну посилання в новому каталозі, але це не «перейменувати».
Якщо необхідно «перейменувати» (фактично - «перемістити») каталог з однієї файлової системи в іншу, то доведеться перемістити ціле дерево підкаталогів з усім їхнім вмістом. Перемістити лише порожні каталоги буде недостатньо;
В межах однієї файлової системи можна створити кілька жорстких посилань на один і той же файл - всі вони посилаються на один і той же індексний вузол, який не змінюється. Якщо буде необхідно перемістити файл в іншу файлову систему, то виникає наступна проблема. Створюється нова жорстка посилання, видаляється стара, але при цьому «стара» копія файлу залишиться на місці, так як файл не можна видалити, поки на нього є хоч одне посилання. Таким чином, замість «перейменування» виходить копіювання.
Якщо змінити повний шлях до файлу, що міститься в символічній посиланням, то в результаті отримаємо неправильну посилання.
І т.д.
Тобто операція перейменування не така проста, як здається на перший погляд.
Як перейменувати каталог?
Можна було б копіювати каталог і вкладені підкаталоги з усім їхнім змістом, а потім видаляти старий каталог, навіть якщо він просто перейменовується, оста ваясь в тому ж самому батьківському каталозі. - Не підходить тому це занадто великий обсяг роботи.
Використовувати системний виклик link для каталогів, нехай навіть виконувати його може тільки суперкористувач. - Відкинутий POSIX і замінений на rename.
Використовувати новий системний виклик, який буде в змозі виконувати переміщення каталогів всередині файлової системи. - Це єдиний спосіб перейменувати каталог без повного копіювання його вмісту.
rename - перейменовує файл «include <stdio.h>
int rename (const char * oldpath, const char * newpath)
oldpath, старе повне ім'я
newpath нове повне ім'я
Повертає 0 у разі успіху, -1 у випадку помилки (код помилки-у змінній errno)
Виклик rename виконує приблизно таку послідовність дій:
1. Якщо newpath існує, то він віддаляється за допомогою unlink або rmdir.
2. Виконується link (oldpath, newpath), навіть якщо oldpath є каталогом.
3. Викликом unlink або rmdir видаляється oldpath.
Крім того, він має свої особливості та обмеження.
Крок 2 працює і з каталогами, навіть якщо процес не має права суперкористувача (процесу достатньо мати право на запис у батьківський каталог newpath).
Якщо newpath існує, тоді й newpath, і oldpath повинні бути одного типу, або файли, або каталоги.
Якщо файл буде перенесено в новий каталог, потрібно вказати ім'я файлу в новому каталозі явно
Якщо newpath існує і є каталогом, він повинен бути порожній (аналогічне правило існує і у rmdir). На кроці 3, якщо oldpath - каталог, він віддаляється, навіть якщо це непорожній каталог, так як його вміст уже мається на newpath.
Якщо oldpath є символічною посиланням, то rename працює з нею, а не з тим, на що вона посилається.
Якщо rename зазнає невдачі, то все залишається без змін.
На перший погляд здається, що кроки 1, 2 і 3 можна оформити у вигляді бібліотечної функції, але, на жаль, немає способу змусити її працювати подібно системного викликом.
На основі системного виклику rename створена утиліта mv, яка може виконувати більш широкий діапазон дій.
переміщати окремі файли і каталоги між файловими системами.
переміщувати групи файлів і каталогів.