Почти все файлы /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/sr0Linux; оба обозначают первое устройство 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, но эта деталь имеет значение только для разработчиков драйверов устройств.