Почти все файлы /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/
создаются автоматически с помощью udev , устаревшего MAKEDEV
.
Actually На самом деле это не так в Linux, но эта деталь имеет значение только для разработчиков драйверов устройств.