$ 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
et ses sous-répertoires sont tous des descripteurs de fichiers de périphériques?/dev/fd/0
, /dev/stdin
, /proc/self/fd/0
sont tous des liens vers /dev/pts/2
.l
dans lrwx------
signifie lien, que signifie c
dans crw--w----
signifier?Presque tous les fichiers sous /dev
sont fichiers de périphérique . Alors que la lecture et l'écriture dans un fichier normal stockent 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 à son tour communique avec un élément matériel (un périphérique matériel, d'où le nom).
Il existe deux types de fichiers de périphérique: les périphériques 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 blocs et les dispositifs de caractères n'est pas complètement universelle. Les périphériques de bloc sont des choses comme les disques, qui se comportent comme des fichiers volumineux de taille fixe: si vous écrivez un octet à un certain décalage, puis lisez à partir du périphérique à ce décalage, vous récupérez cet octet. Les dispositifs 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, non par son nom (le nom est important pour les applications, mais pas pour le noyau). Le numéro est en fait deux chiffres: le numéro majeur indique quel pilote est responsable de cet appareil, et le numéro mineur permet à un pilote de piloter plusieurs appareils¹. Ces chiffres apparaissent dans le ls -l
liste, où vous trouverez 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ériques sous /dev
ne correspond pas aux périphériques matériels. Celui qui existe sur tous les systèmes Unix est /dev/null
; y écrire n'a aucun effet et sa lecture 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 entrée (</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 depuis a à peu près le même effet que l'ouverture du fichier d'origine qui a été ouvert comme entrée standard du processus. De façon assez similaire, /dev/tty
désigne le terminal auquel le processus est connecté. Sous Linux, de nos jours, /dev/stdin
et amis ne sont pas implémentés en tant que périphériques de caractères, mais plutôt en tant que 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 selon la méthode traditionnelle); par exemple /dev/stdin
est un lien symbolique vers /proc/self/fd/0
. Voir Quel est le lien entre/dev/fd et/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 appareil CD. Une autre raison des liens symboliques est l'organisation: sous Linux, vous trouverez vos disques durs et partitions à plusieurs endroits: /dev/sda
et /dev/sda1
et amis (chaque disque est 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é par une étiquette choisie par l'homme); et plus. Des liens symboliques sont également utilisés lorsqu'un nom de périphérique générique peut être l'un des nombreux; par exemple /dev/dvd
pourrait ê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 est le lecteur de DVD par défaut.
Enfin, vous trouverez quelques autres fichiers sous /dev
, pour des raisons traditionnelles. Vous ne trouverez pas la même chose sur tous les systèmes. Sur la plupart des unités, /dev/log
est un socket que les programmes utilisent pour émettre des messages de log. /dev/MAKEDEV
est un script qui crée des entrées dans /dev
. Sur les systèmes Linux modernes, les entrées dans /dev/
sont créés automatiquement par dev , obsolète MAKEDEV
.
¹ Ce n'est plus vrai sous Linux, mais ce détail ne concerne que les rédacteurs de pilotes de périphériques.
/dev/
est pour./dev/stdin
. Cela ne pointe pas statiquement vers /dev/pts/2
ou tout autre - passez simplement à un autre terminal et vous verrez. /dev/stdin
est l'entrée standard de votre session de terminal en cours. C'est également un exemple pour lequel il doit s'agir d'un lien symbolique.man mknod
et info coreutils 'mknod invocation'
. En général, c
représente un type de périphérique de caractère.Pour votre première question, ce ne sont pas des descripteurs de fichiers, ce sont des fichiers de périphériques. (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 sortie ls
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 en cas de fichiers de périphérique. Si c'est 'c' c'est un périphérique de caractère, ou si c'est 'b', c'est un périphérique de bloc.
Pour votre deuxième question, reportez-vous à la réponse ci-dessus par rozcietrzewiacz.