3. Посилання

Найкращим способом зрозуміти, що таке посилання, буде розгляд прикладу. Створімо (звичайний) файл:

$ pwd
/home/queen/example
$ ls
$ touch a
$ ls -il a
32555 -rw-r--r--  1 queen queen 0 Aug  6 19:26 a

Опція -i команди ls виводить номер inode в першому полі вихідних даних. Як бачите, до того, як ми створили файл a, в каталозі не було файлів. Проте нас цікавить третє поле, що представляє собою кількість посилань на файл (ну... насправді посилань на inode).

Команду touch a можна розділити на два дії:

А тепер наберемо наступне:

$ ln a b
$ ls -il a b
32555 -rw-r--r--  2 queen queen 0 Aug  6 19:26 a
32555 -rw-r--r--  2 queen queen 0 Aug  6 19:26 b
$

Ми створили інше посилання на той самий inode. Як бачите, ми не створили файл з ім'ям b. Натомість ми просто додали інше посилання на inode під номером 32555 в тому ж каталозі і присвоїли цьому новому посиланню ім'я b. Як бачите в інформації, виданій командою ls -l, лічильник посилань для inode'а тепер дорівнює 2, а не 1.

Тепер робимо наступне:

$ rm a
$ ls -il b
32555 -rw-r--r--  1 queen queen 0 Aug  6 19:26 b
$

Ми бачимо, що навіть попри те, що ми видалили “оригінальний файл”, inode все одно існує. Але тепер єдина посилання на цей inode - це файл з ім'ям /home/queen/example/b.

Отже, файл в UNIX® не має імені; натомість він має одне чи кілька посилань в одному чи кількох каталогах.

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

Типовими прикладами файлів без посилань (тобто тих, що не мають імен) є мережеві підключення. Ви ніколи не побачите файла, який відповідає вашому підключення до веб-сайту Mandriva Linux , у своєму дереві файлів, в якому б каталозі ви не шукали. Аналогічно, коли ви використовуєте канал в shell'і, inode, що відповідає цьому каналу, існує, але посилання на нього немає. Іншим прикладом використання inode'ів без імен є тимчасові файли. Ви створюєте тимчасовий файл, відкриваєте його, а потім видаляєте. Файл існує, поки його відкрито, але більше його ніхто не може відкрити (бо не існує імені для його відкриття). Звідси, якщо програма завершується аварійно, тимчасовий файл видаляється автоматично.