Специальный файл устройства обеспечивает доступ к физическому устройству. В UNIX различают символьные (character) и блочные (block) файлы устройств. Доступ к устройствам осуществляется путем открытия, чтения и записи в специальный файл устройства.
Символьные файлы устройств используются для небуферизированного обмена данными с устройством, в противоположность этому блочные файлы позволяют производить обмен данными в виде пакетов фиксированной длины — блоков . Доступ к некоторым устройствам может осуществляться как через символьные, так и через блочные специальные файлы.
Как производится работа с периферийными устройствами, описано в главе 5.
FIFO или именованный канал — это файл, используемый для связи между процессами. FIFO впервые появились в System V UNIX, но большинство современных систем поддерживают этот механизм. Более подробно мы рассмотрим этот тип файлов при обсуждении системы межпроцессного взаимодействия в главе 3.
Связь. Как уже говорилось, каталог содержит имена файлов и указатели на их метаданные. В то же время сами метаданные не содержат ни имени файла, ни указателя на это имя. Такая архитектура позволяет одному файлу иметь несколько имен в файловой системе. Имена жестко связаны с метаданными и, соответственно, с данными файла, в то время как сам файл существует независимо от того, как его называют в файловой системе [3] Данное утверждение верно лишь отчасти. Действительно, файлу "безразлично", какие имена он имеет в каталогах, но "небезразлично" число этих имен. Если ни одно из имен файловой системы не ссылается на файл — он должен быть удален (т.е. физически удалены его данные на диске).
. Такая связь имени файла с его данными называется жесткой связью (hard link). Например, с помощью команды ln(1) мы можем создать еще одно имя ( second) файла, на который указывает имя first(рис. 1.2).
Рис. 1.2. Структура файловой системы после выполнения команды ln(1) . Жесткая связь имен с данными файла
$ pwd
/home/andrei
$ ln first /home/sergey/second
Жесткие связи абсолютно равноправны. В списках файлов каталогов, которые можно получить с помощью команды ls(1) , файлы firstи secondбудут отличаться только именем. Все остальные атрибуты файла будут абсолютно одинаковыми. С точки зрения пользователя — это два разных файла. Изменения, внесенные в любой из этих файлов, затронут и другой, поскольку оба они ссылаются на одни и те же данные файла. Вы можете переместить один из файлов в другой каталог — все равно эти имена будут связаны жесткой связью с данными файла. Легко проверить, что удаление одного из файлов ( firstили second) не приведет к удалению самого файла, т.е. его метаданных и данных (если это не специальный файл устройства).
По определению жесткие связи указывают на один и тот же индексный дескриптор inode. Поэтому проверить, имеют ли два имени файла жесткую связь, можно, вызвав команду ls(1) с ключом -i :
$ ls -i /home/andrei/first /home/sergey/second
12567 first
12567 second
Информацию о наличии у файла нескольких имен, связанных с ним жесткими связями, можно получить, просмотрев подробный листинг файлов с помощью команды /ls -l :
$ ls -l /home/sergey
...
-rw-r--r-- 2 andrei staff 7245 Jan 17 8:05 second
...
Во второй колонке листинга указано число жестких связей данного файла.
Сразу оговоримся, что жесткая связь является естественной формой связи имени файла с его метаданными и не принадлежит к особому типу файла. Особым типом файла является символическая связь , позволяющая косвенно адресовать файл. В отличие от жесткой связи, символическая связь адресует файл, который, в свою очередь, ссылается на другой файл. В результате, последний файл адресуется символической связью косвенно (рис. 1.3). Данные файла, являющегося символической связью, содержат только имя целевого файла.
Рис. 1.3. Символическая связь
Проиллюстрируем эти рассуждения на примере. Команда ln(1) с ключом -s позволяет создать символическую связь:
$ pwd
/home/andrei
$ ln -s first /home/sergey/symfirst
Читать дальше