- •Анотація
- •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.7.3 Перейменування файлів і каталогів
Операція перейменування має на увазі зміну назви елементу каталога. Потрібно створити нове жорстке посилання викликом link і видалити старе посилання викликом unlink.
Але в цьому випадку виникає ряд проблем:
файл може бути каталогом, для якого не можна створити друге жорстке посилання;
перейменований об'єкт може опинитися в іншому каталозі. Якщо це каталог тієї ж файлової системи, то проблем не виникає, але якщо інший, то виникне конфлікт, оскільки link може створювати жорсткі посилання тільки в межах однієї файлової системи. Зрозуміло, можна створити символічне посилання в новому каталозі, але це не «перейменувати»;
якщо необхідно «перейменувати» (фактично — «перемістити») каталог з однієї файлової системи в іншу, то доведеться перемістити ціле дерево підкаталогів зі всім їх вмістом. Перемістити лише порожні каталоги буде недостатньо;
в межах однієї файлової системи можна створити декілька жорстких посилань на один і той же файл - всі вони посилаються на один і той же індексний вузол, який не змінюється. Якщо буде необхідно перемістити файл в іншу файлову систему, то виникає наступна проблема. Створюється нове жорстке посилання, віддаляється стара, але при цьому «стара» копія файлу залишиться на місці, оскільки файл не можна видалити, поки на нього є хоч одне посилання. Таким чином, замість «перейменування» виходить копіювання.
якщо змінити повний шлях до файлу, що міститься в символічному посиланні, то в результаті отримаємо неправильне посилання.
І так далі
Тобто операція перейменування не така проста, як здається на перший погляд.
копіювати каталог і вкладені підкаталоги зі всім їх вмістом, а потім видаляти старий каталог, навіть якщо він просто перейменовується, залишаючись в тому ж самому батьківському каталозі. – Не підходить оскільки це дуже великий об'єм роботи;
використовувати системний виклик link для каталогів, нехай навіть викликати його може тільки суперкористувач. - знехтуваний POSIX і замінений на rename
використовувати новий системний виклик, який буде в змозі виконувати переміщення каталогів усередині файлової системи. - Це єдиний спосіб перейменувати каталог бсз повного копіювання його вмісту.
rename — перейменовує файл
# include <stdio.h>
int rename(const char *oldpath, const char *newpath)
oldpath, старе повне ім'я
newpath нове повне ім'я
Повертає 0 у разі успіху -1 у разі помилки (код помилки -в змінної errno)
Виклик rename виконує приблизно наступну послідовність дій:
Якщо newpath існує, то він віддаляється за допомогою unlink або rmdir.
Виконується link (oldpath, newpath), навіть якщо oldpath є каталогом.
Викликом unlink або rmdir віддаляється oldpath.
Крім того, він має свої особливості і обмеження.
Крок 2 працює і з каталогами, навіть якщо процес не володіє правами суперкористувача (процесу досить мати право на запис в батьківський каталог newpath).
Якщо newpath існує, тоді і newpath, і oldpath повинні бути одного типу, або файли, або каталоги.
Якщо файл переміщається в новий каталог, потрібно вказати ім'я файлу в новому каталозі явно
Якщо newpath існує і є каталогом, він повинен бути порожній (аналогічне правило існує і у rmdir). На кроці 3, якщо oldpath — каталог, він віддаляється, навіть якщо це непорожній каталог, оскільки його вміст вже є в newpath.
якщо oldpath є символічним посиланням, то rename працює з нею, а не з тим, на що вона посилається.
Якщо rename терпить невдачу, то все залишається без змін.
На перший погляд здається, що кроки 1, 2 і 3 можна оформити у вигляді бібліотечної функції, але, на жаль, немає способу змусити її працювати подібно до системного виклику.
На основі системного виклику rename створена утиліта mv, яка може виконувати ширший діапазон дій.
переміщати окремі файли і каталоги між файловими системами.
переміщати групи файлів і каталогів.