$ 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
- Je me demandais si tous les fichiers sous
/dev
et ses sous-répertoires sont tous des descripteurs de fichiers de périphériques?
- Pourquoi y a-t-il tant de liens les uns aux autres? Par exemple,
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
sont tous les liens vers /dev/pts/2
.
- Si
l
en lrwx------
lien moyen, qu'est-ce c
en crw--w----
moyenne?
Réponses:
Presque tous les fichiers sous
/dev
sont des fichiers de périphérique . Alors que la lecture et l’écriture dans un fichier standard stocke les 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 du 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 de périphérique: les périphériques de bloc (indiqués par
b
le premier caractère de la sortie dels -l
) et les périphériques de caractères (indiqués parc
). La distinction entre les blocs et les périphériques de caractères n’est pas totalement universelle. Les périphériques en mode bloc sont des éléments tels que les disques, qui se comportent comme des fichiers volumineux de taille fixe: si vous écrivez un octet avec un certain décalage et lisez plus tard à partir du périphérique avec ce décalage, vous récupérez cet octet. Les périphériques de type caractères sont à peu près tout ce qui se passe 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, elle est lue depuis le port série).La signification d'un fichier de périphérique est déterminée par son numéro et 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 ce périphérique et le numéro mineur permet à un pilote de conduire plusieurs périphériques¹. Ces numéros apparaissent dans la
ls -l
liste, où vous trouverez normalement la taille du fichier. Par exemplebrw-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 à des périphériques matériels. Celui qui existe sur tous les systèmes Unix est/dev/null
; son écriture n'a aucun effet et sa lecture ne renvoie aucune donnée. C'est souvent pratique dans les scripts shell, quand vous voulez ignorer le résultat d'une commande (>/dev/null
) ou exécuter une commande sans input (</dev/null
). D'autres exemples courants sont/dev/zero
(qui renvoie des octets nuls ad infinitum )/dev/urandom
(qui renvoie des octets aléatoires ad infinitum ).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 de ouvre a à peu près le même effet que d'ouvrir le fichier d'origine ouvert en tant qu'entrée standard du processus. De manière similaire,/dev/tty
désigne le terminal auquel le processus est connecté. De nos jours, sous Linux, les/dev/stdin
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 tous les descripteurs de fichiers (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 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/dev/sr0
sous Linux; les deux désignent le premier périphérique CD. Une autre raison de liens symboliques est l' organisation: sous Linux, vous trouverez vos disques et partitions de disque en plusieurs endroits:/dev/sda
et/dev/sda1
et les amis (chaque disque désigné par une lettre arbitraire, et les partitions en fonction de la mise en page de la partition),/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 des plusieurs; par exemple/dev/dvd
Il peut s'agir d'un lien symbolique vers/dev/sr0
, ou 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 existe 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 ordinateurs,/dev/log
est un socket utilisé par les programmes pour émettre des messages de journal./dev/MAKEDEV
est un script qui crée des entrées dans/dev
. Sur les systèmes Linux modernes, les entrées/dev/
sont créées automatiquement par udev , obsolèteMAKEDEV
.¹ En réalité, cela n’est plus vrai sous Linux, mais ce détail n’a d’importance que pour les auteurs de pilotes de périphérique.
la source
ls -l
liste où vous retrouvez normalement la taille du fichier, avant la date, par exemplebrw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ cet appareil est majeur 8, mineur 0. Les numéros d'appareils ne sont pas fréquents dans la pratique, je viens juste de les mentionner pour dire Ce qui fait d’un appareil un appareil (le plus important, ce n’est pas le nom du fichier). Un numéro de descripteur de fichier n'a de signification que dans un processus particulier./dev/stdin
(=>/proc/self/fd/0
) sous Linux n'a pas le même effet que la duplication d'une entrée standard. Pour voir la différence,su - non_root_user
alorsexec 5</dev/stdin
échouera avec "Permission Denied", maisexec 5<&0
réussira. Et il est non seulement que le nouveau fd sera ouvert avec des drapeaux différents, tout sur l'objet fichier ( « descrip fichier ouvert tion » dans le jargon Posix) sera différent (pointeur de fichier offset, mode non / blocage, etc.)./dev/
pour cela./dev/stdin
. Cela ne pointe pas statiquement/dev/pts/2
ni vers un autre - il suffit de basculer vers un autre terminal et vous verrez./dev/stdin
est l'entrée standard de votre session de terminal actuelle . C'est aussi un exemple pour lequel il doit s'agir d'un lien symbolique.man mknod
etinfo coreutils 'mknod invocation'
. En général,c
correspond à un type de périphérique.la source
/dev/stdin
fait référence à l'entrée standard du processus qui l'ouvrira. Tout ce qu’il contient/proc/$pid
est constitué de données dépendantes du processus et/proc/self
constitue une sorte de lien symbolique magique pointant vers les données du processus.Pour votre première question, ce ne sont pas des descripteurs de fichier, ce sont des fichiers de périphérique. (aka "dev noeuds")
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
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 de caractères, 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 de rozcietrzewiacz.
la source