Індексні дескриптори UNIX

Файл має декілька компонентів: імя, вміст, службову інформацію, таку як права доступу і час модифікації Службова інформація зберігається в індексному дескрипторі («inode», раніше було «i-node», але з часом дефіс зник) разом з такою системною інформацією, як розмір файлу, розташування його на диску, та іншими відомостями

Індексний дескриптор зберігає три значення часу: час послід нього зміни (записи), час останнього використання (читання або виконання) і час останньої зміни самого індексного дескриптора, наприклад при зміні прав доступу

$ date

Tue Sep 27 12:07:24  EDT  1983

$ date &gtjunk

$ ls -l junk

–rw–rw–rw–  1 you                  29 Sep 27 12:07  junk

$ ls -lu junk

–rw–rw–rw–  1 you                  29 Sep 27 06:11  junk

$ ls -lc junk

–rw–rw–rw–  1 you                  29 Sep 27 12:07  junk

$

Як показує команда ls-lu, зміна змісту файлу не впливає на час його використання, а зміна прав доступу позначається тільки на часі зміни індексного дескриптора, що видно з результатів виконання команди ls-lc

$ chmod  444 junk

$ ls -lu junk

–r––r––r––  1 you                  29 Sep 27 06:11  junk

$ ls -lc junk

–r––r––r––  1 you                  29 Sep 27 12:11  junk

$ chmod  666 junk

$

Команда ls-t сортує файли за часом, за замовчуванням це час останньої зміни Параметр-t може застосовуватися разом з параметром-c або-u для визначення порядку зміни індексних дескрипторів або читання файлів:

$ ls recipes

cookie pie

$ ls -lut

total  2

drwxrwxrwx  4 you                  64 Sep 27 12:11  recipes

–rw–rw–rw–  1 you                  29 Sep 27 06:11  junk

$

Каталог recipes використовувався останнім, тому що тільки що проглядалося його вміст

Розуміння індексних дескрипторів необхідно не тільки з точки зору параметрів команди ls, але й тому, що можна сказати, що індексні дескриптори – це єфайли Єдине призначення ієрархії каталогів полягає в наданні зручних імен фай лов Внутрішнє системне імя файлу – це номер його індексного дескриптора (i-number), що зберігає інформацію про фото Десяткові значення номерів індексних дескрипторів показує команда ls-i:

$ date &gtx

$ ls -i 15768 junk 15274  recipes 15852 x

$

Перед імям файлу, в перших двох байтах записи каталогу, якраз і зберігається номер його індексного дескриптора Команда od-d, на відміну від вісімкового побайтного, виводить десятковий дамп парами, дозволяючи побачити значення i-number

$ od -c  

0000000    4          \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0    \0

0000020 273     (        \0    \0    \0    \0    \0    \0    \0    \0   \0    \0    \0    \0

0000040 252        r   e     c     i   p     e     s    \0    \0    \0    \0    \0    \0    \0

0000060 230     =     j   u     n     k   \0    \0    \0    \0    \0    \0    \0    \0    \0    \0

0000100 354     =     x   \0    \0    \0    \0    \0    \0    \0    \0    \0   \0    \0    \0    \0

0000120

$ od -d  

0000000 15156 00046 00000 00000 00000 00000 00000  00000

0000020 10427 11822 00000 00000 00000 00000 00000  00000

0000040 15274 25970 26979 25968 00115 00000 00000  00000

0000060 15768 30058 27502 00000 00000 00000 00000  00000

0000100 15852 00120 00000 00000 00000 00000 00000  00000

0000120

$

Перші два байти кожного запису каталогу є єдиним звязком імені файлу з його вмістом Тому імя файлу і називаєтьсяпосиланням, Адже воно повязує імя в ієрархії каталогів з індексним дескриптором і, отже, з даними Одне і те ж значення номера індексного дескриптора може зустрічатися в декількох каталогах Команда rm насправді видаляє не індексні дескриптори, а записи в каталозі, тобто посилання І тільки коли зникне остання посилання на файл, система видаляє індексний дескриптор, а значить і сам файл

Якщо номер індексного дескриптора в елементі каталогу дорівнює нулю, це означає, що дане посилання була видалена, чого не можна сказати про вміст файлу – можливо, десь ще залишилися посилання на нього Переконаємося в тому, що значення i-number обнуляється при видаленні файлу:

$ rm x

$ od -d  

0000000 15156 00046 00000 00000 00000 00000 00000  00000

0000020 10427 11822 00000 00000 00000 00000 00000  00000

0000040 15274 25970 26979 25968 00115 00000 00000  00000

0000060 15768 30058 27502 00000 00000 00000 00000  00000

0000100 00000 00120 00000 00000 00000 00000 00000  00000

0000120

$

Наступний створений в цьому каталозі файл займе порожнє місце, хоча, швидше за все, значення i-number буде іншим

Посилання на існуючий файл створюється командою ln:

$ ln старий5файл новий5файл

Призначення посилань полягає в тому, щоб дати файлу кілька імен, розташованих, можливо, в різних каталогах У багатьох системах існує посилання / bin / e на файл / bin / ed, що дозволяє викликати редактор e Посилання, які вказують на один файл, мають однакові значення номера індексного дескриптора:

$ ln  junk  linktojunk

$ ls -li

total  3

15768 –rw–rw–rw–  2 you                  29 Sep 27 12:07  junk

15768 –rw–rw–rw–  2 you                   29  Sep 27 12:07  linktojunk 15274  drwxrwxrwx  4 you                  64 Sep  27 09:34  recipes

$

Число між рядком прав доступу і імям власника показує кількість посилань на файл Оскільки посилання є лише покажчик на запис в індексному дескрипторі, всі посилання рівноправні, немає різниці між перший з них і всіма наступними (Майте на увазі, що через такі повторів ls неправильно підраховує підсумковий обсяг дискового простору)

Якщо файл був змінений, то зміни будуть помітні по всіх посиланнях, адже це все той же файл

$ echo x &gtjunk

$ ls -l

total  3

–rw–rw–rw–  2 you                    2 Sep 27 12:37  junk

–rw–rw–rw–  2 you                     2  Sep 27 12:37  linktojunk drwxrwxrwx  4 you                   64  Sep 27 09:34  recipes

$ rm linktojunk

$ ls -l

total  2

–rw–rw–rw–  1 you                     2  Sep 27 12:37  junk drwxrwxrwx  4 you                   64  Sep 27 09:34  recipes

$

Після видалення посилання linktojunk лічильник посилань повернувся до колишнього значення 1 Як вже говорилося, видалення файлу командою rm лише стирає посилання, а сам файл існує, поки на нього є хоча б одна посилання Звичайно, більшості файлів досить одного посилання, але і тут ми бачимо, як проста ідея дає виняткову гнучкість

Застереження для квапливих: як тільки видалена останнє посилання на файл, його дані втрачаються Видалені файли потрапляють в піч, а не в сміттєву корзину, і відновити їх з попелу вже не вдасться (Є, однак, примарна надія на відновлення У більшості великих систем періодично виконується резервне копіювання для зберігання файлів, що змінилися в безпечному місці, зазвичай на магнітній стрічці, звідки їх можна відновити Для власної безпеки і спокою поцікавтеся, як часто виконується копіювання у вашій системі Якщо таке відсутнє, будьте обережні, збій диска може обернутися катастрофою)

Посилання на файли зручні, коли потрібно одночасний доступ користувачів до файлу, але іноді доцільно мати окрему копію – другий файл з тією ж інформацією Перед редагуванням документа корисно зробити копію, щоб мати можливість відмовитися від змін і повернутися до оригіналу Посилання тут не допоможе, так як всі посилання ведуть до вже зміненого файлу Копіювання виконується командою cp:

$ cp junk  copyofjunk

$ ls -li

total  3

15850 –rw–rw–rw–  1 you                     2  Sep 27 13:13  copyofjunk 15768  –rw–rw–rw–  1 you                    2 Sep  27 12:37  junk

15274 drwxrwxrwx  4 you                  64 Sep 27 09:34  recipes

$

Номери індексних дескрипторів файлів junk і copyofjunk різні, бо це різні файли, що мають в даний момент однакове со-

тримання Радимо змінити права доступу до резервної копії, щоб уникнути випадкового видалення

$ chmod-w copyofjunk Прибрати дозвіл на запис

$ ls -li

total  3

15850 –r––r––r––  1 you                     2  Sep 27 13:13  copyofjunk 15768  –rw–rw–rw–  1 you                    2 Sep  27 12:37  junk

15274 drwxrwxrwx  4 you                  64 Sep 27 09:34  recipes

$ rm copyofjunk

rm:  copyofjunk  444 mode  n Ні Це цінно

$ date &gtjunk

$ ls -li

total  3

15850 –r––r––r––  1 you                     2  Sep 27 13:13  copyofjunk 15768  –rw–rw–rw–  1 you                  29 Sep  27 13:16  junk

15274 drwxrwxrwx  4 you                  64 Sep 27 09:34  recipes

$ rm copyofjunk

rm:  copyofjunk  444 mode  y Ну, а це не так цінно

$ ls -li

total  2

15768 –rw–rw–rw–  1 you                   29  Sep 27 13:16  junk 15274  drwxrwxrwx  4 you                  64  Sep 27 09:34  recipes

$

Ні зміна копії, ні її видаленню не позначаться на оригіналі Зверніть увагу, що заборона на запис у файл copyofjunk змушує команду rm запитувати підтвердження на його видалення

Є ще одна поширена команда для роботи з файлами: mv переміщує (перейменовує) файли, просто перебудовуючи посилання Синтаксис аналогічний використовуваному в командах cp і ln:

$ mv  junk  sameoldjunk

$ ls -li

total  2

15274 drwxrwxrwx  4 you                  64  Sep 27 09:34  recipes 15768  –rw–rw–rw–  1 you                  29 Sep  27  13:16  sameoldjunk

$

Значення i-number файлу sameoldjunk показує, що це той же самий файл, що і колишній junk, змінилося тільки його імя, то є елемент каталогу, повязаний з індексним дескриптором, які мають номер  15 768

Було реалізовано переміщення файлу всередині одного каталогу, але такі перестановки можливі й між каталогами Часто кілька посилань з однаковими іменами, розташовані в різних каталогах, вказують на один файл, наприклад, коли кілька користувачів працюють з однією і тією ж програмою або документом Команда mv може переміщати каталог або файл з одного каталогу в інший Для

таких часто повторюваних дій в командах mv і cp передбачений спеціальний синтаксис:

$ mv  (або cp)  файл1 файл2 .. каталог

Тут один або декілька файлів переміщуються (або копіюються) в каталог, який визначається останнім аргументом Копії та посилання підлозі чають ті ж імена, що й вихідні файли Наприклад, щоб удосконалити редактор (якщо виникне таке бажання), можете виконати команду

$ cp /usr/src/cmd/edc

і отримати власну копію вихідного тексту для експериментів

А якщо збираєтеся попрацювати над оболонкою, то створіть каталог

$ mkdir  sh

$ cp /usr/src/cmd/sh/* sh

і командою cp скопіюйте туди її вихідні файли (тут передбачається, що в / usr / src / cmd / sh немає підкаталогів, так як команда cp не зможе їх створити) У деяких системах ln також може приймати кілька аргументів і останнім теж має бути імя каталогу А в деяких системах mv, cp і ln самі є посиланнями на один і той же файл, який перевіряє, за яким імені до нього звертаються, і залежно від цього вибирає потрібну дію

Вправа 26 Чому команда ls-l повідомляє про 4 посиланнях на reci-pes Примітка: використовуйте

$ ls -ld /usr/you

Чим корисна ця інформація ~

Вправа 27 У чому різниця між

$ mv  junk  junk1

і

$ cp junk  junk1

$ rm junk

Підказка: створіть посилання на junk і перевірте її значення ~

Вправа 28Команда cp копіює тільки файли першого рівня ієрархії і не може копіювати підкаталоги Що вона зробить, якщо один з аргументів виявиться каталогом Чи зручно це Порівняйте три способи: параметр команди cp для переходу в підкаталоги, окрему команду rcp (рекурсивне копіювання) та копіювання каталогів командою cp за замовчуванням За додатковою інформацією про реалізацію цієї можливості зверніться до глави 7 Яку користь іншим програмам принесла б можливість проходу по дереву каталогів ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*