Altre risposte hanno aggiunto grandi cose. Aggiungerò solo i miei 2 centesimi.
Secondo Wikipedia lo sappiamo per certo: un descrittore di file è un numero intero non negativo. La cosa più importante che penso manchi, sarebbe quella di dire:
I descrittori di file sono associati a un ID processo.
Sappiamo che i descrittori di file più famosi sono 0, 1 e 2. 0 corrisponde a STDIN
, 1 a STDOUT
e 2 a STDERR
.
Ad esempio, prendi i processi di shell come esempio e come si applica?
Dai un'occhiata a questo codice
#>sleep 1000 &
[12] 14726
Abbiamo creato un processo con l'id 14726 (PID). Usando il lsof -p 14726
possiamo ottenere le cose in questo modo:
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 quarta colonna FD e la successiva colonna TYPE corrispondono al tipo di descrittore di file e al descrittore di file.
Alcuni dei valori per l'FD possono essere:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Ma il descrittore di file reale è sotto:
NUMBER – Represent the actual file descriptor.
Il carattere dopo il numero, ad esempio "1u", rappresenta la modalità di apertura del file. r per leggere, w per scrivere, u per leggere e scrivere.
TYPE specifica il tipo di file. Alcuni dei valori di TYPE sono:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Ma tutti i descrittori di file sono CHR - File speciale carattere (o file dispositivo carattere)
Ora, siamo in grado di identificare i descrittori di file per STDIN
, STDOUT
e STDERR
facile con lsof -p PID
, o siamo in grado di vedere lo stesso se noi ls /proc/PID/fd
.
Si noti inoltre che la tabella dei descrittori di file di cui il kernel tiene traccia non è la stessa della tabella dei file o della tabella degli inode. Questi sono separati, come hanno spiegato alcune altre risposte.
Potresti chiederti dove sono fisicamente questi descrittori di file e in cosa sono memorizzati /dev/pts/6
ad esempio
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
Bene, /dev/pts/6
vive puramente nella memoria. Questi non sono file regolari, ma i cosiddetti file di dispositivi a caratteri . Puoi verificarlo con: ls -l /dev/pts/6
e inizieranno con c
, nel mio caso crw--w----
.
Solo per ricordare la maggior parte di Linux come OS definire sette tipi di file:
- File regolari
- Elenchi
- File del dispositivo carattere
- Blocca i file del dispositivo
- Socket di dominio locale
- Named pipe (FIFOs) e
- Collegamenti simbolici