$ 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
- Мне было интересно, если все файлы в
/dev
и его подкаталогах все файловые дескрипторы устройств?
- Почему так много ссылок друг от друга? Например,
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
все ссылки на /dev/pts/2
.
- Если
l
в lrwx------
средней ссылке, что значит c
в crw--w----
?
Ответы:
Почти все файлы
/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, но эта деталь имеет значение только для разработчиков драйверов устройств.
источник
ls -l
списке указаны цифры, в которых вы обычно найдете размер файла до даты, например,brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ это устройство старшее 8, младшее 0. Номера устройств на практике встречаются не часто, я просто упомянул их, чтобы сказать что делает устройство устройством (главное, это не имя файла). Номер дескриптора файла имеет значение только в конкретном процессе./dev/stdin
(=>/proc/self/fd/0
) в Linux не имеет такого же эффекта, как дублирование стандартного ввода. Чтобы увидеть разницу,su - non_root_user
затемexec 5</dev/stdin
произойдет сбой с «Отказано в доступе», ноexec 5<&0
все получится. И это не только то , что новый FD будет открыт с разными флагами, все о файле объекта ( «открытого файла Описан Тион » в POSIX жаргоне) будет отличаться (указатель файла смещения, не / режим блокировки, и т.д.)./dev/
для чего./dev/stdin
. Это не указывает статически на/dev/pts/2
или любой другой - просто переключиться на другой терминал , и вы увидите./dev/stdin
стандартный ввод вашей текущей терминальной сессии. Это также пример того, почему это должна быть символическая ссылка.man mknod
иinfo coreutils 'mknod invocation'
. В общем,c
обозначает тип устройства характер.источник
/dev/stdin
относится к стандартному вводу процесса, который его откроет. Все в нем/proc/$pid
зависит от процесса и/proc/self
представляет собой магическую символическую ссылку, указывающую на собственные данные процесса.На первый вопрос, они не дескрипторы файлов, а файлы устройств. (он же "узлы разработки")
Эти файлы связаны с драйвером, который обрабатывает устройство с использованием старших и младших номеров. (Например, «136, 2» в ваших
ls
выходных данных относится к драйверу устройства, связанному с основным номером 136, и указывает устройство № 2, обрабатываемое этим драйвером.)Первая буква вывода
ls -l
- тип устройства в случае файлов устройства. Если это «c», то это символьное устройство или «b», это блочное устройство.По второму вопросу обратитесь к приведенному выше ответу от rozcietrzewiacz.
источник