Семь стандартных типов файлов Unix — это обычные , каталоги , символические ссылки , специальные FIFO , специальные блоки , специальные символы и сокеты , как определено в POSIX . [1] Различные реализации ОС допускают больше типов, чем требует POSIX (например, Solaris doors ). Тип файла можно определить с помощью ls -l
команды, которая отображает тип в первом символе поля разрешений файловой системы .
Для обычных файлов Unix не навязывает и не предоставляет никакой внутренней файловой структуры; поэтому их структура и интерпретация полностью зависят от программного обеспечения, которое их использует. [2] Однако fileкоманда обычно может использоваться для определения того, какой тип данных они содержат. [3]
В структуре stat тип файла и разрешения ( режим ) хранятся вместе в st_mode
битовом поле , размер которого составляет не менее 12 бит (3 бита для указания типа среди семи возможных типов файлов; 9 бит для разрешений). Макет разрешений определяется POSIX как наименее значимый из 9 бит, но остальное не определено. [1]
По соглашению режим представляет собой 16-битное значение, записанное как шестизначное восьмеричное число без начального нуля. Часть формата занимает первые 4 бита (2 восьмеричные цифры), а «010» ( 1000 в двоичной системе) обычно обозначает обычный файл. Следующие 3 бита (1 цифра) обычно используются для setuid, setgid и sticky . Последняя часть уже определена POSIX для содержания разрешения. Примером может служить «100644» для типичного файла. Этот формат можно увидеть в git , tar и ar , а также в других местах. [4]
Тип файла можно проверить с помощью макросов, таких как S_ISDIR
. Такая проверка обычно выполняется путем маскирования режима с помощью S_IFMT
(часто восьмеричного числа "170000" для соглашения о первых 4 битах) и проверки соответствия результата S_IFDIR
. S_IFMT
— это не основная концепция POSIX, а расширение X/Open System Interfaces (XSI); системы, соответствующие только POSIX, могут использовать некоторые другие методы. [1]
Возьмем для примера одну строку в ls -l
выводе:
drwxr-xr-x 2 root root 0 1 января 1970 г. главная
POSIX определяет [5] формат вывода для длинного формата ( -l
опция). В частности, первое поле (до первого пробела) дублируется "строкой режима файла", здесь drwxr-xr-x
. Его первый символ описывает тип файла, здесь d
(каталог). Остальная часть этой строки указывает права доступа к файлу .
Версия GNU coreutils использует ls
вызов filemode()
функции glibc (представленной в библиотеке gnulib [6] ) для получения строки режима.
FreeBSD использует более простой подход, но допускает меньшее количество типов файлов. [7]
Наиболее распространенным специальным файлом является каталог. Структура файла каталога определяется используемой файловой системой. Поскольку в Unix доступно несколько файловых систем, как собственных, так и не собственных, единой структуры файла каталога не существует.
Каталог помечается как d
первая буква в поле режима в выводе ls -dl
[5] или stat
, например
$ ls -dl / d rwxr-xr-x 26 root root 4096 22 сентября 09:29 /$ стат / Файл: "/" Размер: 4096 Блоки: 8 Блок ввода-вывода: 4096 каталогУстройство: 802h/2050d Inode: 128 Ссылки: 26Доступ: (0755/ d rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)...
Символическая ссылка — это ссылка на другой файл. Этот специальный файл хранится как текстовое представление пути к файлу, на который сделана ссылка (что означает, что место назначения может быть относительным путем или может вообще не существовать).
Символическая ссылка помечается l
(строчной буквой L
) в качестве первой буквы строки режима, например, в этом сокращенном ls -l
выводе: [5]
l rwxrwxrwx ... termcap -> /usr/share/misc/termcap l rwxrwxrwx ... S03xinetd -> ../init.d/xinetd
Одной из сильных сторон Unix всегда была межпроцессная коммуникация . Среди возможностей, предоставляемых ОС, есть каналы , которые соединяют вывод одного процесса с вводом другого. Это нормально, если оба процесса существуют в одном и том же родительском пространстве процесса и запущены одним и тем же пользователем, но существуют обстоятельства, при которых взаимодействующие процессы должны использовать FIFO, здесь называемые именованными каналами . Одно из таких обстоятельств возникает, когда процессы должны выполняться под разными именами пользователей и разрешениями.
Именованные каналы — это специальные файлы, которые могут существовать в любом месте файловой системы. Их можно создать с помощью команды, mkfifo
как в mkfifo mypipe
.
Именованный канал помечается p
первой буквой строки режима, например, в этом сокращенном ls -l
выводе: [5]
п рв-рв---- ... моя труба
Сокет — это специальный файл, используемый для межпроцессного взаимодействия , который обеспечивает взаимодействие между двумя процессами. Помимо отправки данных, процессы могут отправлять дескрипторы файлов через доменное сокетное соединение Unix с помощью системных вызовов sendmsg()
и recvmsg()
.
В отличие от именованных каналов, которые допускают только однонаправленный поток данных, сокеты поддерживают полную дуплексную связь .
Сокет помечается как s
первая буква строки режима, например
с rwxrwxrwx /tmp/.X11-unix/X0
В Unix почти все вещи обрабатываются как файлы и имеют местоположение в файловой системе, даже аппаратные устройства, такие как жесткие диски. Большим исключением являются сетевые устройства, которые не появляются в файловой системе, а обрабатываются отдельно.
Файлы устройств используются для применения прав доступа к устройствам и для направления операций с файлами соответствующим драйверам устройств.
Unix делает различие между символьными и блочными устройствами. Различие примерно следующее:
Хотя, например, разделы диска могут иметь как символьные устройства, которые обеспечивают небуферизованный произвольный доступ к блокам на разделе, так и блочные устройства, которые обеспечивают буферизованный произвольный доступ к блокам на разделе.
Символьное устройство помечается как c
первая буква строки режима, а блочное устройство помечается как b
, например, в этом сокращенном ls -l
выводе: [5]
c rw-rw-rw- ... /dev/null b rw-rw---- ... /dev/sda
Файл — это не более чем поток байтов...