it-swarm-ru.tech

Понимание / dev и его подкаталогов и файлов

$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Мне было интересно, все ли файлы под /dev и ​​все его подкаталоги являются файловыми дескрипторами устройств?
  2. Почему так много ссылок друг от друга? Например, /dev/fd/0, /dev/stdin, /proc/self/fd/0 все ссылки на /dev/pts/2.
  3. Если l in lrwx------ означает ссылку, что означает c в crw--w---- жадный?
55
Tim

Почти все файлы в /dev являются файлы устройств . В то время как при чтении и записи в обычный файл хранятся данные на диске или в другой файловой системе, доступ к файлу устройства связывается с драйвером в ядре, которое обычно, в свою очередь, связывается с частью аппаратного обеспечения (аппаратное устройство, отсюда и название).

Существует два типа файлов устройств: блочные устройства (обозначенные b в качестве первого символа в выходных данных ls -l) и символьные устройства (обозначенные c). Различие между блочными и символьными устройствами не является полностью универсальным. Блочные устройства - это, например, диски, которые ведут себя как большие файлы фиксированного размера: если вы записываете байт с определенным смещением, а затем читаете с устройства с этим смещением, вы получаете этот байт обратно. Символьные устройства - это почти все остальное, где запись байта имеет некоторый непосредственный эффект (например, он передается по последовательной линии), а чтение байта также имеет некоторый непосредственный эффект (например, его чтение с последовательного порта).

Значение файла устройства определяется его номером, а не именем (имя имеет значение для приложений, но не для ядра). На самом деле это два числа: основной номер указывает, какой драйвер отвечает за данное устройство, а младший номер позволяет драйверу управлять несколькими устройствами¹. Эти цифры появляются в ls -l список, где вы обычно найдете размер файла. Например. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda → это устройство мажор 8, минор 0.

Некоторые файлы устройств под /dev не соответствуют аппаратным устройствам. Тот, который существует в каждой системе Unix, является /dev/null; запись в него не имеет никакого эффекта, и чтение из него никогда не возвращает никаких данных. Это часто удобно в сценариях оболочки, когда вы хотите игнорировать вывод команды (>/dev/null) или выполните команду без ввода (</dev/null). Другими распространенными примерами являются /dev/zero (который возвращает нулевые байты до бесконечности ) /dev/urandom (который возвращает случайные байты до бесконечности ).

Некоторые файлы устройств имеют значение, которое зависит от процесса, который обращается к нему. Например, /dev/stdin обозначает стандартный ввод текущего процесса; Открытие из примерно имеет тот же эффект, что и открытие исходного файла, который был открыт как стандартный ввод процесса. Несколько похоже, /dev/tty обозначает терминал, к которому подключен процесс. В настоящее время под Linux /dev/stdin и ​​друзья реализованы не как символьные устройства, а вместо этого как символические ссылки на более общий механизм, который позволяет ссылаться на каждый дескриптор файла (в отличие от 0, 1 и 2 в традиционном методе); например /dev/stdin является символической ссылкой на /proc/self/fd/0. Смотрите Как/dev/fd относится к/proc/self/fd /? .

Вы найдете несколько символических ссылок под /dev. Это может происходить по историческим причинам: файл устройства был перемещен из одного имени в другое, но некоторые приложения все еще используют старое имя. Например, /dev/scd0 является символической ссылкой на /dev/sr0 под Linux; оба обозначают первое устройство CD. Другой причиной символических ссылок является организация: под Linux вы найдете свои жесткие диски и разделы в нескольких местах: /dev/sda а также /dev/sda1 и ​​друзья (каждый диск обозначен произвольной буквой, а разделы - в соответствии с разметкой разделов), /dev/disk/by-id/* (диски, обозначенные уникальным серийным номером), /dev/disk/by-label/* (разделы с файловой системой, обозначенные меткой, выбранной человеком); и более. Символьные ссылки также используются, когда родовое имя устройства может быть одним из нескольких; например /dev/dvd может быть символической ссылкой на /dev/sr0, или это может быть ссылка на /dev/sr1 если у вас есть два устройства чтения компакт-дисков, а второе - устройство чтения DVD-дисков по умолчанию.

Наконец, есть несколько других файлов, которые вы можете найти в /dev, по традиционным причинам. Вы не найдете то же самое в каждой системе. На большинстве юнитов /dev/log --- это сокет , который программы используют для отправки сообщений журнала. /dev/MAKEDEV это скрипт, который создает записи в /dev. В современных системах Linux записи в /dev/ создаются автоматически с помощью dev , устаревая MAKEDEV.

Actually На самом деле это не так в Linux, но эта деталь имеет значение только для разработчиков драйверов устройств.

82
Gilles 'SO- stop being evil'
  1. Да - напрямую или в виде символических ссылок - вот что /dev/ для.
  2. Для различных целей: иногда для совместимости схем именования, иногда это необходимо для рабочей среды - как в примере /dev/stdin. Это не указывает статически на /dev/pts/2 или любой другой - просто переключитесь на другой терминал, и вы увидите. /dev/stdin - это стандартный ввод вашей текущей терминальной сессии. Это также пример того, почему это должна быть символическая ссылка.
  3. Видеть man mknod а также info coreutils 'mknod invocation'. В общем, c обозначает тип устройства chararacter.
14
rozcietrzewiacz

На первый вопрос, они не дескрипторы файлов, а файлы устройств. (a.k.a. "узлы разработчика")

Эти файлы связаны с драйвером, который обрабатывает устройство с использованием старших и младших номеров. (Например, "136, 2" в вашем выходе ls относится к драйверу устройства, связанному с основным номером 136, и указывает устройство № 2, обрабатываемое этим драйвером.)

Первая буква вывода ls -l - тип устройства в случае файлов устройства. Если это "c", то это символьное устройство или "b", это блочное устройство.

По второму вопросу обратитесь к приведенному выше ответу от rozcietrzewiacz.

11
rulingminds