D'autres réponses ont ajouté d'excellentes choses. J'ajouterai juste mes 2 cents.
Selon Wikipedia, nous savons avec certitude: un descripteur de fichier est un entier non négatif. Je pense que la chose la plus importante qui manque est de dire:
Les descripteurs de fichiers sont liés à un ID de processus.
Nous savons que les descripteurs de fichiers les plus connus sont 0, 1 et 2. 0 correspond à STDIN
, 1 à STDOUT
et 2 à STDERR
.
Prenons l'exemple des processus shell et comment cela s'applique-t-il?
Découvrez ce code
#>sleep 1000 &
[12] 14726
Nous avons créé un processus avec l'ID 14726 (PID). En utilisant le lsof -p 14726
nous pouvons obtenir des choses comme ceci:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
La 4ème colonne FD et la toute prochaine colonne TYPE correspondent au descripteur de fichier et au type de descripteur de fichier.
Certaines des valeurs pour le FD peuvent être:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Mais le vrai descripteur de fichier est sous:
NUMBER – Represent the actual file descriptor.
Le caractère après le chiffre, c'est-à-dire "1u", représente le mode dans lequel le fichier est ouvert. r pour lire, w pour écrire, u pour lire et écrire.
TYPE spécifie le type du fichier. Certaines des valeurs des TYPE sont:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Mais tous les descripteurs de fichiers sont CHR - Fichier spécial de caractères (ou fichier de périphérique de caractères)
Maintenant, nous pouvons identifier les descripteurs de fichiers pour STDIN
, STDOUT
et STDERR
facile avec lsof -p PID
, ou nous pouvons voir la même chose si nous ls /proc/PID/fd
.
Notez également que la table de descripteurs de fichiers dont le noyau assure le suivi n'est pas la même que la table de fichiers ou la table d'inodes. Celles-ci sont distinctes, comme l'expliquent certaines autres réponses.
Vous pouvez vous demander où sont physiquement ces descripteurs de fichiers et ce qui est stocké /dev/pts/6
par exemple
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Eh bien, /dev/pts/6
vit purement dans la mémoire. Ce ne sont pas des fichiers normaux, mais des fichiers appelés périphériques de caractères . Vous pouvez vérifier cela avec: ls -l /dev/pts/6
et ils commenceront par c
, dans mon cas crw--w----
.
Juste pour rappeler la plupart des Linux comme OS, définissez sept types de fichiers:
- Fichiers réguliers
- Répertoires
- Fichiers de périphérique de caractères
- Bloquer les fichiers de l'appareil
- Prises de domaine local
- Tubes nommés (FIFO) et
- Liens symboliques