Типы файлов в Linux
Философия операционных систем Unix гласит, что все есть файл. Это значит, что вся работа с этой операционной системой сводится к файлам. Поскольку Linux можно считать тоже потомком Unix, то эта концепция применима и здесь. Файлы это объекты, в которые мы записываем информацию и наши данные, исполняемые файлы, но кроме этих привычных нам понятий здесь есть файлы специального назначения — файлы устройств, файлы туннелей, сокетов и многое другое. Эта тема очень слабо освещена в интернете, поэтому в нашей сегодняшней статье мы рассмотрим типы файлов linux.
Пространство нашего жесткого диска занято файлами разных типов. Например, взять даже наш корневой раздел (/), при создании файла, файловая система записывает его в определенном формате на нужное физическое место жесткого диска. Всегда, для работы с файлами используется файловая система, но не всегда она записывает файлы на диск, файловая система может работать на лету, генерируя файлы, например, как procfs, с помощью которой может быть выполнена настройка ядра linux или записывать файлы в оперативную память, как tmpfs расположенная в папке /tmp. Но все это не имеет значения, ведь в любом случае мы имеем дело именно с файлами.
В системе Linux нет различий между каталогами и файлами. Но каталоги могут объединять другие файлы в группы, чтобы их было легче найти и использовать. Все аппаратные устройства представлены в виде файлов и находятся в каталоге dev, только через эти файлы программы могут работать с ними.
Преимущество использования файлов как для обычной информации, так и для устройств, в том, что не нужно реализовать отдельный набор API интерфейсов для каждого устройства, с ним могут работать все стандартные утилиты Linux и API интерфейсы.
Типы файлов в Linux
Файлы в операционной системе Linux можно поделить на три основных типа:
- Обычные файлы, для хранения информации
- Специальные файлы — для устройств и туннелей
- Директории
Дальше рассмотрим более подробно эти типы файлов linux.
Обычные файлы
Это файлы, с которыми мы привыкли работать каждый день, они могут содержать текст, исполняемые инструкции для программ, изображения или другую информацию. Это самый распространенный тип файлов, которые вы можете найти в системе Linux. Рассмотрим небольшой список относящихся сюда файлов:
- Текстовые файлы
- Исполняемые файлы
- Файлы изображений
- Файлы архивов
- Файлы библиотек программ
- И другие подобные типы
Утилита ls может определять тип файла в режиме списка, обычные файлы обозначаются черточкой, например:
Эта статья была бы неполной, если бы мы рассматривали типы файлов, но не упомянули о форматах. Дело в том, что все обычные файлы сохранены в определенном формате, это нужно, чтобы система знала какой программой нужно открывать файл.
Посмотреть форматы файлов linux можно с помощью утилиты file. Например:
Система сообщила что это исполняемый файл, а теперь посмотрим обычный, текстовый:
Утилита умеет распознавать все известные форматы файлов. Чтобы узнать вывести все доступные форматы файлов linux наберите:
Специальные файлы
Специальные файлы намного интереснее, они предназначены для обмена информации с ядром, работы с устройствами или общения между программами. Такие файлы могут тоже быть нескольких типов, в зависимости от назначения.
Блочные файлы — это файлы устройств, которые обеспечивают буферизованный доступ к аппаратным компонентам. При записи данных на жесткий диск или на флешку нет смысла записывать данные сразу же после их поступления. Так мы будем только понапрасну расходовать ресурс устройства и энергию. Можно подождать пока наберется достаточное количество данных а потом записать их за один раз. Эти данные и собираются в буфере. С помощью таких файлов, файловая система и другие утилиты могут обращаться к драйверам аппаратных устройств. Такие файлы могут передать большой блок данных за небольшой один раз.
Утилита ls обозначает блочные файлы буквой b, например, выберем все блочные файлы из каталога /dev:
Утилита file, которую мы рассматривали в предыдущем разделе тоже умеет определять типы файлов:
Символьные файлы обеспечивают не буферизованный доступ к аппаратным компонентам и ядру. Поскольку у них нет буфера, они позволяют передавать только по одному символу за один раз. А в остальном, это такие же файлы устройств, как и блочные файлы.
Вы также можете отфильтровать их с помощью ls. Символьные файлы обозначаются буквой c (character):
Символические ссылки — это файлы, которые указывают на другие файлы в системе по их имени. Они могут указывать как на обычные файлы, таки на каталоги или другие типы файлов в linux. По сути, это те же ярлыки Windows. В Linux еще есть жесткие ссылки, но они не имеют отношения к типу файлов, потому что реализованы на уровне файловой системы и считаются обычными файлами. Поскольку они указывают на одно и то же место на диске, это два разных файла, с одинаковым содержимым.
Но вернемся к символическим ссылкам. Утилита ls обозначает их буквой l (link):
Создавать символические ссылки можно с помощью утилиты ln. Например:
ln -s file1.txt file2.txt
Можете использовать ls чтобы убедиться в том, что это ссылка. Проверьте таким же образом жесткие ссылки, чтобы убедиться, что то что я сказал о них — правда.
Туннели и именованные туннели — это файлы, позволяющие настроить связь между двумя процессами перенаправив вывод одного процесса на вход другого. Именованные туннели используются для связи между двумя процессами и работают так же как и обычные туннели.
Обозначаются такие типы файлов linux буквой p (pipe):
Чтобы создать именованный тоннель вы можете использовать утилиту mkfifo:
echo «test test test» > pipe1
После создания туннеля мы передали в него данные, и оболочка стала не интерактивной. Она будет ожидать пока данные будут прочитаны на другом конце туннеля. Открываем другую оболочку и читаем данные:
while read line ;do echo «Data: ‘$line’ «; done
Файлы сокетов — это файлы, обеспечивающие прямую связь между процессами, они могут передавать информацию между процессами, запущенными в разных средах или даже разных машинах. Это значит, что с помощью сокетов программы могут обмениваться данными даже по сети. По сути, сокет работает так же как туннели, но только в обе стороны.
Файлы сокетов обозначаются буквой s:
Создать сокет можно с помощью функции socket() на языке программирования Си, чтение и запись выполняется системными вызовами read() и write(). Но нам сейчас не нужно писать реальную программу, будет достаточно немного поиграться. Поэтому воспользуемся утилитой nc. Создаем Unix сокет:
Подключаемся к нему из другой консоли:
Все данные, которые вы будете набирать в одной из консолей будут отправляться на другую после нажатия Enter, связь работает в обоих направлениях.
Каталоги
Это специальные файлы, которые позволяют объединять другие и каталоги в группы для более простой навигации и поиска. Естественно, они могут содержать как обычные, так и специальные файлы, одним словом любые типы файлов ос linux. В системе Linux, файлы организуются в папки начиная от корня (/)
Обозначаются каталоги буквой d (directory):
Создать каталог в linux можно с помощью команды mkdir:
Заключение
Теперь у вас более четкое представление о том, почему в linux все является файлами, а также какие типы файлов в linux существуют в вашей системе. Вы можете найти более подробную информацию по каждому виду файлов в интернете, но если у вас остались вопросы, можете задать их в комментариях!
5.4.4. Определение типа файла
5.4.4. Определение типа файла
Вспомните, что в поле st_mode закодированы как тип файла, так и права доступа к нему. определяет ряд макросов, которые определяют тип файла. В частности, эти макросы возвращают true или false при использовании с полем st_mode . У каждого описанного ранее типа файла есть свой макрос. Предположим, выполняется следующий код:
char filename[PATH_МАХ]; /* PATH_MAX из
*/
/* . поместить имя файла в filename . */
if (stat(filename, &stbuf)
Когда система заполнила stbuf , можно вызывать следующие макросы, причем в качестве аргумента передается stbuf.st_mode :
Возвращает true , если filename является обычным файлом.
Возвращает true , если filename является каталогом.
Возвращает true , если filename является символьным устройством. Устройства вскоре будут обсуждены более подробно.
Возвращает true , если filename является блочным устройством.
Возвращает true , если filename является FIFO.
Возвращает true , если filename является символической ссылкой. (Это может никогда не вернуть true , если вместо lstat() использовались stat() или fstat() .)
Возвращает true , если filename является сокетом.
ЗАМЕЧАНИЕ. В GNU/Linux эти макросы возвращают 1 для true и 0 для false . Однако, на других системах возможно, что они будут возвращать для true вместо 1 произвольное неотрицательное число. (POSIX определяет лишь ненулевое значение в противоположность нулевому). Поэтому всегда следует использовать эти макросы как автономные тесты вместо проверки возвращаемого значения.
if (S_ISREG(stbuf.st_mode) ==1) .
Наряду с макросами предоставляет два набора битовых масок. Один набор для проверки прав доступа, а другой — для проверки типа файла. Мы видели маски прав доступа в разделе 4.6 «Создание файлов», когда обсуждали тип mode_t и значения для open() и creat() . Битовые маски, их числовые значения для GNU/Linux и смысл приведены в табл. 5.2.
Таблица 5.2. Битовые маски POSIX для типов файлов и прав доступа в
Маска | Значение | Комментарий |
---|---|---|
S_IFMT | 0170000 | Маска для битовых полей типа файла |
S_IFSOCK | 0140000 | Сокет. |
S_IFLNK | 0120000 | Символическая ссылка |
S_IFREG | 0100000 | Обычный файл. |
S_IFBLK | 0060000 | Блочное устройство. |
S_IFDIR | 0040000 | Каталог. |
S_IFCHR | 0020000 | Символьное устройство. |
S_IFIFO | 0010000 | FIFO. |
S_ISUID | 0004000 | Бит setuid. |
S_ISGID | 0002000 | Бит setgid |
S_ISVTX | 0001000 | «Липкий» (sticky) бит. |
S_IRWXU | 0000700 | Маска для прав доступа владельца. |
S_IRUSR | 0000400 | Доступ на чтение для владельца. |
S_IWUSR | 0000200 | Доступ на запись для владельца. |
S_IXUSR | 0000100 | Доступ на исполнение для владельца. |
S_IRWXG | 0000070 | Маска для прав доступа группы. |
S_IRGRP | 0000040 | Доступ на чтение для группы. |
S_IWGRP | 0000020 | Доступ на запись для группы. |
S_IXGRP | 0000010 | Доступ на исполнение для группы. |
S_IRWXO | 0000007 | Маска для прав доступа остальных. |
S_IROTH | 0000004 | Доступ на чтение для остальных. |
S_IWOTH | 0000002 | Доступ на запись для остальных. |
S_IXOTH | 0000001 | Доступ на исполнение для остальных. |
Некоторые из этих масок служат цели изолирования различных наборов битов, закодированных в поле st_mode :
• S_IFMT представляет биты 12–15, которыми закодированы различные типы файлов.
• S_IRWXU представляет биты 6–8, являющиеся правами доступа владельца (на чтение, запись, исполнение для User).
• S_IRWXG представляет биты 3–5, являющиеся правами доступа группы (на чтение, запись, исполнение для Group).
• S_IRWXO представляет биты 0–2, являющиеся правами доступа для «остальных» (на чтение, запись, исполнение для Other).
Биты прав доступа и типа файла графически изображены на рис. 5.3.
Рис. 5.3. Биты прав доступа и типа файлов
Маски типов файлов стандартизованы главным образом для совместимости со старым кодом; они не должны использоваться непосредственно, поскольку такой код менее читаем, чем соответствующие макросы. Случается, что макрос реализован с использованием масок: довольно логично, но это не подходит для кода уровня пользователя.
Стандарт POSIX явным образом констатирует; что в будущем не будут стандартизированы новые битовые маски и что тесты для любых дополнительных разновидностей типов файлов, которые могут быть добавлены, будут доступны лишь в виде макросов S_ISxxx() .