stringtranslate.com

Типы файлов Unix

Семь стандартных типов файлов 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

FIFO (именованный канал)

Одной из сильных сторон 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

Ссылки

  1. ^ abc "<sys/stat.h>". The Open Group Base Specifications Issue 6. The Open Group. 21 июля 2019 г. Архивировано из оригинала 27 ноября 2016 г. Получено 10 февраля 2017 г.
  2. ^ Лукидес, Майк (октябрь 2002 г.). «Когда файл не является файлом?». Unix Power Tools (3-е изд.). O'Reilly. стр. 80. ISBN 9780596003302. Файл — это не более чем поток байтов...
  3. ^ "файл". IEEE Std 1003.1-2017 ( POSIX ) . The Open Group . 2018. Архивировано из оригинала 2018-10-12 . Получено 2023-10-26 .
  4. ^ Китт, Стивен. «Какой файловый режим является символической ссылкой?». Unix & Linux Stack Exchange .
  5. ^ abcde "ls". IEEE Std 1003.1-2008 ( POSIX ) . The Open Group. 11 марта 2017 г. Архивировано из оригинала 3 августа 2017 г. Получено 10 февраля 2017 г.
  6. ^ «Функция файлового режима в GNU coreutils». ГНУ. 11 марта 2017 г.
  7. ^ "Функция printtype из FreeBSD". FreeBSD. 11 марта 2017 г.