Presque tous les fichiers sous /dev
sont des fichiers de périphérique. Alors que la lecture et l'écriture dans un fichier normal stocke des données sur un disque ou un autre système de fichiers, l'accès à un fichier de périphérique communique avec un pilote dans le noyau, qui communique généralement à son tour avec un élément matériel (un périphérique matériel, d'où son nom).
Il existe deux types de fichiers d'appareils :les appareils de bloc (indiqués par b
comme premier caractère dans la sortie de ls -l
) et les périphériques de caractères (indiqués par c
). La distinction entre les périphériques de bloc et de caractère n'est pas complètement universelle. Les périphériques blocs sont des choses comme des disques, qui se comportent comme des fichiers volumineux et de taille fixe :si vous écrivez un octet à un certain décalage, et que vous lisez plus tard à partir du périphérique à ce décalage, vous récupérez cet octet. Les périphériques de caractères sont à peu près n'importe quoi d'autre, où l'écriture d'un octet a un effet immédiat (par exemple, il est émis sur une ligne série) et la lecture d'un octet a également un effet immédiat (par exemple, il est lu à partir du port série).
La signification d'un fichier de périphérique est déterminée par son numéro, pas par son nom (le nom compte pour les applications, mais pas pour le noyau). Le nombre est en fait composé de deux nombres :le nombre majeur indique quel pilote est responsable de cet appareil, et le nombre mineur permet à un pilote de piloter plusieurs appareils¹. Ces numéros apparaissent dans le ls -l
liste, où vous trouveriez normalement la taille du fichier. Par exemple. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ cet appareil est majeur 8, mineur 0.
Certains fichiers de périphérique sous /dev
ne correspondent pas aux périphériques matériels. Un qui existe sur chaque système Unix est /dev/null
; écrire dessus n'a aucun effet et lire à partir de celui-ci ne renvoie jamais de données. C'est souvent pratique dans les scripts shell, lorsque vous souhaitez ignorer la sortie d'une commande (>/dev/null
) ou exécutez une commande sans saisie (</dev/null
). D'autres exemples courants sont /dev/zero
(qui renvoie des octets nuls à l'infini ) /dev/urandom
(qui renvoie des octets aléatoires à l'infini ).
Quelques fichiers de périphérique ont une signification qui dépend du processus qui y accède. Par exemple, /dev/stdin
désigne l'entrée standard du processus en cours; l'ouverture à partir de a approximativement le même effet que l'ouverture du fichier d'origine qui a été ouvert comme entrée standard du processus. Un peu de la même manière, /dev/tty
désigne le terminal auquel le processus est connecté. Sous Linux, de nos jours, /dev/stdin
et les amis ne sont pas implémentés comme des périphériques de caractères, mais plutôt comme des liens symboliques vers un mécanisme plus général qui permet de référencer chaque descripteur de fichier (par opposition à seulement 0, 1 et 2 dans la méthode traditionnelle) ; par exemple /dev/stdin
est un lien symbolique vers /proc/self/fd/0
. Voir Comment /dev/fd est-il lié à /proc/self/fd/?.
Vous trouverez un certain nombre de liens symboliques sous /dev
. Cela peut se produire pour des raisons historiques :un fichier de périphérique a été déplacé d'un nom à un autre, mais certaines applications utilisent toujours l'ancien nom. Par exemple, /dev/scd0
est un lien symbolique vers /dev/sr0
sous Linux; les deux désignent le premier périphérique CD. Une autre raison des liens symboliques est l'organisation :sous Linux, vous trouverez vos disques durs et vos partitions à plusieurs endroits :/dev/sda
et /dev/sda1
and friends (chaque disque désigné par une lettre arbitraire, et les partitions selon la disposition des partitions), /dev/disk/by-id/*
(disques désignés par un numéro de série unique), /dev/disk/by-label/*
(partitions avec un système de fichiers, désignées par une étiquette choisie par l'homme) ; et plus. Les liens symboliques sont également utilisés lorsqu'un nom de périphérique générique peut être l'un de plusieurs; par exemple /dev/dvd
peut être un lien symbolique vers /dev/sr0
, ou il peut s'agir d'un lien vers /dev/sr1
si vous avez deux lecteurs de CD et que le second doit être le lecteur de DVD par défaut.
Enfin, il y a quelques autres fichiers que vous pourriez trouver sous /dev
, pour des raisons traditionnelles. Vous ne trouverez pas la même chose sur tous les systèmes. Sur la plupart des unix, /dev/log
est un socket que les programmes utilisent pour émettre des messages de journalisation. /dev/MAKEDEV
est un script qui crée des entrées en /dev
. Sur les systèmes Linux modernes, les entrées en /dev/
sont créés automatiquement par udev, rendant MAKEDEV
obsolète .
¹ Ce n'est plus vrai sous Linux, mais ce détail n'a d'importance que pour les auteurs de pilotes de périphériques.
- Oui - soit directement, soit sous forme de liens symboliques - c'est ce que
/dev/
est pour. - A des fins diverses :parfois pour la compatibilité entre les schémas de nommage, parfois c'est nécessaire pour l'environnement de travail - comme dans l'exemple de
/dev/stdin
. Cela n'est pas pointer statiquement à/dev/pts/2
ou tout autre - passez simplement à un autre terminal et vous verrez./dev/stdin
est l'entrée standard de votre courant séance terminale. C'est aussi un exemple de la raison pour laquelle il doit s'agir d'un lien symbolique. - Voir
man mknod
etinfo coreutils 'mknod invocation'
. En général,c
représente un type d'appareil de caractère.
Pour votre première question, ce ne sont pas des descripteurs de fichiers, ce sont des fichiers de périphérique. (alias "nœuds de développement")
Ces fichiers sont liés au pilote qui gère le périphérique en utilisant des nombres majeurs et mineurs. (Par exemple, "136, 2" dans votre ls
la sortie fait référence au pilote de périphérique lié au numéro majeur 136 et spécifie le périphérique n° 2 géré par ce pilote.)
La première lettre de sortie de ls -l
est le type de périphérique dans le cas de fichiers de périphérique. Si c'est 'c' c'est un périphérique caractère, ou si c'est 'b' c'est un périphérique bloc.
Pour votre deuxième question, reportez-vous à la réponse ci-dessus de rozcietrzewiacz.