Семь стандартных типов Unix файлов являются регулярными , каталог , символическая ссылка , FIFO специальный , специальный блочный , специальный символьный , и гнездо , как определено POSIX . [1] Различные реализации для конкретных ОС допускают большее количество типов, чем требуется POSIX (например, двери Solaris ). Тип файла можно определить с помощью ls -l
команды, которая отображает тип в первом символе поля разрешений файловой системы .
Для обычных файлов , Unix не навязывает или предоставить какой - либо внутренней структуры файла; поэтому их структура и интерпретация полностью зависят от используемого программного обеспечения. Однако с помощью этой file
команды можно определить, какой тип данных они содержат.
Представления
Числовой
В структуре stat тип файла и разрешения ( режим ) хранятся вместе в st_mode
битовом поле , которое имеет размер не менее 12 бит (3 бита для указания типа среди семи возможных типов файлов; 9 бит для разрешений) . Макет разрешений определяется POSIX как минимум 9 битов, но остальные не определены. [1]
По соглашению, режим представляет собой 16-битное значение, записанное как шестизначное восьмеричное число без начального нуля. Часть формата занимает первые 4 бита (2 цифры), а «10» ( 1000 в двоичном формате) обычно обозначает обычный файл. Средние 3 бита (1 цифра) обычно используются для setuid, setgid и sticky . Последняя часть уже определена POSIX как содержащая разрешение. Пример: «100644» для типичного файла. Этот формат можно увидеть , среди прочего, в git , tar и ar . [2]
Тип файла можно проверить с помощью макросов, например 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 г. home
POSIX определяет [3] формат вывода для длинного формата ( -l
опция). В частности, первое поле (перед первым пробелом) называется «строкой режима файла», а его первый символ описывает тип файла. Остальная часть этой строки указывает права доступа к файлу .
Следовательно, в примере строка режима drwxr-xr-x
: тип файла d
(каталог) и разрешения rwxr-xr-x
.
Примеры реализаций
В GNU Coreutils версия ls
использует вызов filemode()
, Glibc функция (выставлены в gnulib библиотеке [4] ) , чтобы получить строку режима.
FreeBSD использует более простой подход, но допускает меньшее количество типов файлов. [5]
Обычный файл
Обычные файлы отображаются ls -l
с дефисом-минусом -
в поле режима:
$ ls -l / etc / passwd - rw-r - r-- ... / etc / passwd
Каталог
Самый распространенный специальный файл - это каталог. Структура файла каталога определяется используемой файловой системой. Поскольку в Unix доступно несколько файловых систем, как собственных, так и неродных, нет единого макета файла каталога.
Каталог помечается d
как первая буква в поле режима вывода ls -dl
или stat
, например
$ ls -dl / d rwxr-xr-x 26 root root 4096 22 сентября 09:29 /$ stat / Файл: "/" Размер: 4096 Блоки: 8 Блок ввода-вывода: 4096 директорийУстройство: 802h / 2050d Inode: 128 Ссылки: 26Доступ: (0755 / d rwxr-xr-x) Uid: (0 / root) Gid: (0 / root)...
Символическая ссылка
Символьная ссылка - это ссылка на другой файл. Этот специальный файл хранится как текстовое представление пути к файлу, на который имеется ссылка (что означает, что место назначения может быть относительным путем или может не существовать вообще).
Символьная ссылка помечается l
(нижним регистром L
) как первая буква строки режима, например
l rwxrwxrwx ... termcap -> / usr / share / misc / termcap l rwxrwxrwx ... S03xinetd -> ../init.d/xinetd
FIFO (именованный канал)
Одной из сильных сторон Unix всегда была связь между процессами . Среди средств, предоставляемых ОС, есть каналы , которые соединяют выход одного процесса со входом другого. Это нормально, если оба процесса существуют в одном и том же пространстве родительских процессов, запущенных одним и тем же пользователем, но есть обстоятельства, когда взаимодействующие процессы должны использовать FIFO, здесь называемые именованными каналами . Одно из таких обстоятельств возникает, когда процессы должны выполняться под разными именами пользователей и разрешениями.
Именованные каналы - это специальные файлы, которые могут существовать в любом месте файловой системы. Их можно создать с помощью команды, mkfifo
как в mkfifo mypipe
.
Именованный канал помечается p
как первая буква строки режима, например
п рв-рв ---- ... mypipe
Разъем
Сокет - это специальный файл, используемый для межпроцессного взаимодействия , который обеспечивает связь между двумя процессами. В дополнении к отправке данных, процессы могут послать дескрипторы файлов через сокет - соединение домена Unix , используя sendmsg()
и recvmsg()
системные вызовы.
В отличие от именованных каналов, которые допускают только однонаправленный поток данных, сокеты полностью поддерживают дуплекс .
Сокет помечается s
как первая буква строки режима, например
s rwxrwxrwx /tmp/.X11-unix/X0
Файл устройства (блок, символ)
В Unix почти все вещи обрабатываются как файлы и имеют место в файловой системе, даже аппаратные устройства, такие как жесткие диски. Великое исключение - сетевые устройства, которые не появляются в файловой системе, а обрабатываются отдельно.
Файлы устройств используются для применения прав доступа к устройствам и для направления операций с файлами соответствующим драйверам устройств.
Unix делает различие между символьными и блочными устройствами. Различие примерно следующее:
- Символьные устройства обеспечивают только последовательный поток ввода или принимают последовательный поток вывода.
- Блочные устройства доступны в произвольном порядке
Хотя, например, разделы диска могут иметь как символьные устройства, обеспечивающие небуферизованный произвольный доступ к блокам в разделе, так и блочные устройства, обеспечивающие буферизованный произвольный доступ к блокам в разделе.
Символьное устройство помечается c
как первая буква в строке режима. Аналогичным образом блочное устройство помечается значком b
, например
c rw ------- ... / dev / null b rw-rw ---- ... / dev / sda
Дверь
Дверь - это специальный файл для межпроцессного взаимодействия между клиентом и сервером, в настоящее время реализованный только в Solaris .
Дверь помечается D
заглавной буквой в строке режима, например
D r - r - r-- ... name_service_door
Смотрите также
Рекомендации
- ^ a b c "
" . Базовые спецификации Open Group Выпуск 6 . Открытая группа. 21 июля 2019. - ^ Китт, Стивен. "Какой файловый режим является символической ссылкой?" . Обмен стеков Unix и Linux .
- ^ «IEEE Std 1003.1-2008 LS» . Открытая группа. 11 марта 2017.
- ^ "функция файлового режима в GNU coreutils" . GNU. 11 марта 2017.
- ^ "функция printtype из FreeBSD" . FreeBSD. 11 марта 2017.