descrittore di file vs. nome del file


Risposte:


12

Tutti e quattro /dev/fd/0, /dev/stdin, /proc/self/fd/0e /dev/pts/2sono i nomi dei file, come lo sono /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, ecc Tutto ma che ultimo esempio sono suscettibili di essere il nome di un file esistente sul computer. Un nome file è una stringa che può designare un file sul tuo filesystem; sotto Linux, qualsiasi stringa che non contiene un byte null e che è lunga al massimo 4096 byte è un nome file valido. Molti di questi nomi sono equivalenti, ad esempio, /bin/shè equivalente a ///bin/sh, /bin/../bin/sh(assumendo /binè una directory esistente), ecc Tutti gli esempi che ho dato finora sono nomi di file assoluti; ci sono anche nomi di file relativi, che non iniziano con a /e il cui significato dipende dalla directory corrente.

La terminologia che circonda i nomi dei file non è universale; a volte "nome file" indica un percorso completo di un file, a volte indica il nome di una voce della directory. La terminologia POSIX è " nome file " o " componente nome percorso " per il nome di una voce della directory e " nome percorso " per un percorso completo.

Un descrittore di file designa un file aperto in un particolare processo. Il kernel mantiene una tabella di descrittori di file per ogni processo. Ogni voce nella tabella dei descrittori di file indica cosa fare se il processo richiede la lettura, la scrittura e altre operazioni sul descrittore di file.

I descrittori di file possono corrispondere a un file e avere un nome associato, ma non tutti. Per quelli che lo fanno, il file può essere un normale file, una directory, un file dispositivo o una pipe denominata (anche chiamata FIFO) (il tipo creato da mkfifo); alcuni sistemi hanno ulteriori possibilità come prese e porte unix. Esempi di descrittori di file a cui non è associato un file con nome includono pipe (il tipo creato da pipe) e socket di rete .

/dev/fd/0, /dev/stdinE /proc/self/fd/0sono i nomi dei file (tutto equivalente) con un significato particolare: tutti hanno designato a seconda di quale file è attualmente accessibile tramite file di descrizione 0. Quando un processo si apre questi, le copie del kernel la voce con indice 0 nella tabella descrittore descrittore di file in una nuova descrittore. Aprire uno di questi file equivale a chiamare dup(0). I file con nome sono un modo per ottenere indirettamente un processo per utilizzare uno dei suoi file già aperti anziché aprire un nuovo file; sono principalmente utili per passare alla riga di comando di un programma, in cui il programma si aspetta che si apra il nome di un file.


@Giles Hai scritto "Ogni voce nella tabella dei descrittori di file indica cosa fare se il processo richiede la lettura, la scrittura e altre operazioni sul descrittore di file." ( Sottolineatura mia). Per quanto ho capito, è semplicemente un intero come lo standard 0,1,2 ecc. Rispettivamente per stdin, stdout e stderr. Sarebbe un valore più alto per i file regolari. Quello che non ottengo dal tuo commento è come questo numero indica "cosa fare se il processo richiede la lettura, la scrittura e altre operazioni sul descrittore di file". . Puoi per favore espandere un po 'su questo?
Geek,

@Geek Una voce nella tabella dei descrittori di file non è un numero. Il numero è l'indice in quella tabella.
Gilles 'SO- smetti di essere malvagio' il

@Giles grazie per aver chiarito il mio malinteso. Adesso lo capisco meglio. Quindi, per favore, puoi dare un esempio di "cosa fare" nella tua risposta. Ho raccolto che ogni voce nella tabella descrittore di file ha di nuovo un puntatore a una tabella di file che contiene informazioni come offset di file, stato del file, ecc. Ma non sono ancora chiaro sulla parte "cosa fare" nella tua risposta.
Geek,

2

Il nome file è solo un nome del file sul filesystem, niente di più - è solo una stringa.

Il descrittore di file è una sorta di oggetto, da cui è possibile leggere e / o scrivere. Quello è file aperto e pronto. Non ci sono solo descrittori di file - stdin, stdout e stderr sono anche descrittori, puoi scriverli e leggerli usando assolutamente le stesse funzioni dei file (tranne che per esempio non puoi cercare). Altri esempi di descrittori che non sono file sono: named pipe e socket di rete.

Nel codice, il descrittore di file è una variabile, puntatore a qualcosa nel kernel, che rappresenta l'oggetto file.

Ad esempio, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 sono tutti collegamenti a / dev / pts / 2. Questi sono quattro descrittori di file o nomi di file?

Tutti questi sono pseudo-file, che possono essere utili per alcuni script o programmi. Puoi aprirli e open () ti restituirà un descrittore di file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.