Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля [30.10.2008]


Программирование в Linux с нуля [13.10.2008]

Здравствуйте! Это очередной выпуск рассылки "Программирование в Linux с нуля".

--- новости Lindevel.Ru ---

Книга "Программирование в Linux с нуля" версия 0.11

Tarball: ftp://ftp.lindevel.ru/pub/zlp/zlp-0.11.tar.gz
Online: http://www.lindevel.ru/zlp


Новые материалы книги

Глава 7. ФАЙЛОВАЯ СИСТЕМА

7.1. Типы файлов

Файловая система в Linux многих пугает своей мнимой сложностью. Устройства, ссылки, "иноды", права доступа: всё это кажется очень непонятным. На самом же деле, если все "разложить по полочкам", то становится очевидным, что проще и быть не может. В этой главе мы совершим экскурс в файловую систему Linux и посмотрим на нее с позиции программиста.

Начнем с типов файлов. С точки зрения содержимого или назначения, файлов огромное множество (изображения, музыка, тексты, исполняемые файлы программ и т. п.). Но нас интересует, какие типы файлов присутствуют в Linux с точки зрения ядра. А их всего семь!

Первый тип - обычные файлы (regular files). Эти файлы предназначены для хранения информации на носителях памяти. К обычным файлам относятся упомянутые выше музыкальные и текстовые файлы; сюда же относят исполняемые файлы программ, конфигурационные файлы, файлы журналов и прочие "хранители различной информации".

Обычные файлы, как мы уже знаем, создаются при помощи системных вызовов open() и creat(). С точки зрения пользователя, существует великое множество способов создания обычных файлов: текстовые редакторы, программы работы с графикой и прочие. Чтобы создать пустой файл, можно, например, воспользоваться утилитой touch, как показано ниже.



$ touch regularfile
$ ls -l regularfile
-rw-r--r-- 1 nn nn 0 2008-10-12 23:38 regularfile

Программа ls, вызванная с флагом -l, вывела на экран дополнитеьлную информацию о файле regularfile. Обратите внимание на поле прав доступа: в самом начале стоит минус, который как раз и сообщает нам, что regularfile - это обычный файл.

Чтение обычных файлов и запись информации осуществляются при помощи системных вызовов, описанных в главе 5. Для удаления обычного файла используется системный вызов unlink(). Почему системный вызов называется именно unlink(), а не что-нибудь более благозвучное, наподобие remove() или delete(), мы узнаем в последующих разделах этой главы. Пользователь может удалить обычный файл командой rm.

Второй тип файлов - это каталоги (directories). Каталоги особым образом хранят информацию о других файлах. Если каталог A содержит информацию о файлах B и C, то говрят, что файлы B и C содержатся в каталоге A. Если же, например, C тоже окажется каталогом, то мы скажем, что C - это подкаталог каталога A.

Каталоги создаются системным вызовом mkdir() или одноимённой утилитой.



$ mkdir directory
$ ls -ld directory
drwxr-xr-x 2 nn nn 4096 2008-10-13 00:28 directory

В показанном выше примере мы создаём каталог с именем directory. Ключ -d программы ls позволяет просмотреть информацию о каталоге, а не о содержимом этого каталога. Первым символом в поле прав доступа теперь является d, сообщающий нам, что это каталог.

Для чтения содержимого каталога используются системные вызовы readdir() и getdents(). Однако эти системные вызовы не предназначены для применения в пользовательских приложениях, поэтому программисты пользуются библиотечными оболочками этих вызовов - одноимённой функцией readdir(), а также функцией rewinddir(). Для открытия и закрытия каталогов применяют библиотечные функции opendir() и closedir(). Пользователь может просмотреть содержимое каталога при помощи утилиты ls.

Для удаления каталогов используется системный вызов rmdir(). Пользователь может удалить пустой каталог одноимённой утилитой rmdir.

Третий тип файлов - символические ссылки (symbolic links). Символическая ссылка хранит информацию о местоположении какого-либо файла в файловой системе и, в большинстве случаев, является "полномочным представителем" этого файла.

Символические ссылки создаются при помощи системного вызова symlink(). Пользователь может создать символическую ссылку программой ln с флагом -s.


$ echo "Hello" > anyfile
$ ln -s anyfile anysymlink
$ cat anysymlink
Hello
$ ls -l anysymlink
lrwxrwxrwx 1 nn nn 7 2008-10-13 01:57 anysymlink -> anyfile


Как видно из приведенного выше примера, символическая ссылка может передаваться программам вместо файла, на который она ссылается. Но важно помнить, что программист при желании может добавить в программу код, распознающий символические ссылки и, например, не допускающий их использования. Но подобные задачи ставятся редко.

В выводе программы ls с флагом -l символическая ссылка обозначается в графе прав доступа символом l. Символические ссылки удаляются подобно обычным файлам: посредством системного вызова unlink() или утилитой rm.

Четвертый и пятый типы файлов - это, соответственно, символьные (character devices) и блочные (block devices) устройства. Как правило, символьное устройство оперирует потоками данных, а блочные устройства имеют дело с блоками информации фиксированного размера. Символьные устройства создаются для непосредственного обмена данными с драйвером, находящимся в ядре. Блочные устройства в основном предназначены для того, чтобы создавать на них файловые системы. Подробнее об устройствах речь пойдет в других главах книги.

Сейчас лишь важно понять, что символьные и блочные устройства связаны с драйверами, которые находятся в ядре. Это могут быть драйверы, связанные с реальными аппаратными устройствами (например, принтер, жесткий диск, раздел жесткого диска), так и виртуаьлные драйверы (генератор случайных чисел, генератор нулей /dev/zero, блочная петля (loop device)).

Каждому драйверу в ядре присвоена пара номеров, причем у драйверов символьных устройств своя нумерация, у блочных - своя. В реальности несколькими парами номеров может управлять один драйвер, но сейчас речь не об этом. Первый номер в паре называют старшим (major), а второй - младшим (minor). Некоторые номера жестко прописаны за конкретными устройствами (например, /dev/null всегда имеет старший номер 1 и младший 3), другие же являются "плавающими" и выделяются ядром динамически из свободного списка по мере необходимости.

Зная старший и младший номера интересующего нас устройства, мы можем создать файл этого устройства при помощи утилиты mknod. Не лишним будет заметить, что для одной и той же пары номеров можно создать в файловой системе сколь угодно много устройств. Символьные и блочные устройства создаются при помощи системного вызова mknod() или при помощи одноименной утилиты. В зависимости от конфигурации системы, у обычного пользователя может не быть прав на использование mknod().

Типичным представителем символьных устройств является /dev/null, виртуальное устройство, которое бесследно "съедает" любую передаваемую ему информацию.


$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 2008-10-12 18:36 /dev/null


Как видим, в выводе ls с флагом -l символьные устройства показаны символом c. В поле, где у обычных файлов пишется размер, у устройств фигурируют их номера, в данном случае 1 и 3. Блочные устройства обозначаются в выводе ls -l символом b.


$ ls -l /dev/?da
brw-r----- 1 root disk 8, 0 2008-10-12 18:36 /dev/sda

Удаляются файлы устройств при помощи системного вызова unlink() или утилитой rm.

Шестым типом файлов являются именованные каналы FIFO (First In, First Out). Эти файлы используются для локального взаимодействия процессов, когда один процесс записывает в файл информацию, а другой процесс читает. Подробно именованные каналы FIFO будут рассматриваться в последующих главах книги.

FIFO создаются при помощи системного вызова mkfifo() или утилитой mkfifo.


$ ls -l myfifo
prw-r--r-- 1 nn nn 0 2008-10-13 03:50 myfifo

В выводе ls -l FIFO обозначаются символом p. Для удаления именованного канала используется системный вызов unlink() или утилита rm.

И, наконец, седьмой тип файлов - локальные сокеты или, как их еще называют, Unix-сокеты (Unix-sockets). Сокеты - это очень мощный и универсальный способ взаимодействия процессов. Этой теме будет посвящена отдельная глава книги.

В выводе ls -l сокеты обозначаются символом s. Создаются локальные сокеты при помощи системных вызовов socket() и bind(), а удаляются при помощи системного вызова unlink() или утилитой rm.

Контакты

Сайт проекта Lindevel.Ru (http://www.lindevel.ru) посвящен программированию в Linux. Здесь вы всегда сможете найти последнюю версию книги, а также оставить вопросы и пожелания в форуме (http://lindevel.ru/forum).


Рассылки Subscribe.Ru
FreeBSD

В избранное