(Hmm: il seguente è un po 'epico ...)
Il design della directory su filesystem unix (che, per essere pedanti, sono tipicamente ma non necessariamente collegati ai sistemi operativi unix) rappresenta una visione meravigliosa, che in realtà riduce il numero di casi speciali richiesti.
Una 'directory' è in realtà solo un file nel filesystem. Tutto il contenuto effettivo dei file nel filesystem è inode (dalla tua domanda, posso vedere che sei già a conoscenza di alcune di queste cose). Non c'è struttura per gli inode sul disco: sono solo un grosso mucchio di BLOB numerati di byte, sparsi come burro di arachidi sul disco. Questo non è utile e in effetti è repellente per chiunque abbia un briciolo di ordine mentale.
L' unico inode speciale è l'inode numero 2 (non 0 o 1, per motivi di Tradizione); l'inode 2 è un file di directory: la directory principale . Quando il sistema monta il filesystem, "sa" che deve leggere inode 2 per avviarsi.
Un file di directory è solo un file, con una struttura interna che deve essere letta da opendir (3) e dagli amici. Puoi vedere la sua struttura interna documentata in dir (5) (a seconda del tuo sistema operativo); se lo guardi, vedrai che la voce del file di directory non contiene quasi alcuna informazione sul file, tutto è nell'inode del file. Una delle poche cose speciali di questo file è che la funzione open (2) genererà un errore se si tenta di aprire un file di directory con una modalità che consente la scrittura. Vari altri comandi (per scegliere solo un esempio hexdump
) si rifiuteranno di agire normalmente con i file di directory, solo perché probabilmente non è quello che vuoi fare (ma quello è il loro caso speciale, non quello del filesystem).
Un hard link non è altro che una voce nella mappa di un file di directory. Puoi avere due (o più) voci in tale mappa che entrambe mappano allo stesso numero di inode: quell'inode quindi ha due (o più) hard link. Questo spiega anche perché ogni file ha almeno un 'hard link'. L'inode ha un conteggio di riferimento, che registra quante volte l'inode è menzionato in un file di directory da qualche parte nel filesystem (questo è il numero che vedi quando lo fai ls -l
).
OK: stiamo arrivando al punto ora.
Il file di directory è una mappa di stringhe ('nomi file') in numeri (numeri di inode). Quei numeri di inode sono i numeri degli inode dei file che sono "in" quella directory. I file che si trovano in quella directory potrebbero includere altri file di directory, quindi i loro numeri di inode saranno tra quelli elencati nella directory. Pertanto, se si dispone di un file /tmp/foo/bar
, il file di directory foo
include una voce per bar
, associando quella stringa all'inode per quel file. C'è anche una voce nel file di directory /tmp
, per il file di directory foo
che è 'nella' directory /tmp
.
Quando si crea una directory con mkdir (2), quella funzione
- crea un file di directory (con un certo numero di inode) con la struttura interna corretta,
- aggiunge una voce alla directory principale, mappando il nome della nuova directory su questo nuovo inode (che rappresenta uno dei collegamenti),
- aggiunge una voce alla nuova directory, mappando la stringa '.' allo stesso inode (questo rappresenta l'altro collegamento) e
- aggiunge un'altra voce alla nuova directory, mappando la stringa '..' sull'inode del file di directory modificato nel passaggio (2) (questo spiega il maggior numero di hard link che vedrai sui file di directory che contengono sottodirectory ).
Il risultato finale è che (quasi) gli unici casi speciali sono:
- La funzione open (2) cerca di rendere più difficile spararti ai piedi, impedendoti di aprire i file della directory per la scrittura.
- La funzione mkdir (2) rende le cose piacevoli e facili aggiungendo un paio di voci extra ('.' E '..') al nuovo file di directory, puramente per rendere conveniente lo spostamento nel filesystem. Ho il sospetto che il filesystem funzionerebbe perfettamente bene senza "." e '..', ma sarebbe un dolore da usare.
- Il file di directory è uno dei pochi tipi di file che sono contrassegnati come "speciali" - questo è ciò che dice cose come open (2) a comportarsi in modo leggermente diverso. Vedi
st_mode
in stat (2).
(copiato dalla domanda originale di StackOverflow, 20-10-2011)
..
collegamenti fissi, il tuo software tree walking deve già avere delle eccezioni "non seguire i cicli sul collegamento della directory principale" , quindi è una piccola complessità aggiunta ad eccezione del.
collegamento.