In realtà è piuttosto semplice, almeno se non hai bisogno dei dettagli di implementazione.
Prima di tutto, su Linux tutti i file system (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) sono implementati nel kernel. Alcuni possono scaricare il lavoro nel codice userland tramite FUSE, e alcuni sono disponibili solo sotto forma di un modulo del kernel ( ZFS nativo è un esempio notevole di quest'ultimo a causa delle restrizioni di licenza), ma in entrambi i casi rimane un componente del kernel. Questa è una base importante.
Quando un programma vuole leggere da un file, esso emetterà diverse chiamate di libreria di sistema che alla fine finiscono nel kernel nella forma di open()
, read()
, close()
la sequenza (possibilmente con seek()
gettato in buona misura). Il kernel prende il percorso e il nome file forniti e attraverso il file system e il livello I / O del dispositivo li traduce in richieste fisiche di lettura (e in molti casi anche richieste di scrittura, ad esempio aggiornamenti atime) in alcuni archivi sottostanti.
Tuttavia, non deve tradurre tali richieste in modo specifico in memoria fisica e persistente . Il contratto del kernel prevede che l'emissione di quel particolare insieme di chiamate di sistema fornirà il contenuto del file in questione . Dove esattamente nel nostro regno fisico il "file" esiste è secondario a questo.
Di /proc
solito è montato ciò che è noto come procfs
. Questo è un tipo di file system speciale, ma poiché è un file system, in realtà non è diverso da un ext3
file system montato da qualche parte. Quindi la richiesta viene passata al codice del driver del file system procfs, che conosce tutti questi file e directory e restituisce particolari informazioni dalle strutture di dati del kernel .
Il "livello di archiviazione" in questo caso sono le strutture di dati del kernel e procfs
forniscono un'interfaccia pulita e conveniente per accedervi. Tieni presente che il montaggio di procfs /proc
è semplicemente una convenzione; potresti semplicemente montarlo altrove. In effetti, a volte ciò viene fatto, ad esempio nelle chroot jail quando il processo in esecuzione ha bisogno di accedere a / proc per qualche motivo.
Funziona allo stesso modo se si scrive un valore in un file; a livello di kernel, che si traduce in una serie di open()
, seek()
, write()
, close()
le chiamate che ancora una volta viene passato al driver del file system; di nuovo, in questo caso particolare, il codice procfs.
Il motivo particolare per cui vedi file
tornare empty
è che molti dei file esposti da procfs sono esposti con una dimensione di 0 byte. La dimensione di 0 byte è probabilmente un'ottimizzazione sul lato kernel (molti dei file in / proc sono dinamici e possono facilmente variare in lunghezza, possibilmente anche da una lettura alla successiva, e calcolare la lunghezza di ogni file su ogni directory letto sarebbe potenzialmente essere molto costoso). Passando dai commenti a questa risposta, che puoi verificare sul tuo sistema eseguendo strace o uno strumento simile, invia file
prima una stat()
chiamata per rilevare eventuali file speciali, quindi coglie l'occasione, se la dimensione del file è segnalata come 0 , interrompere e segnalare il file come vuoto.
Questo comportamento è effettivamente documentato e può essere modificato specificando -s
o --special-files
sulla file
chiamata, anche se, come indicato nella pagina di manuale che può avere effetti collaterali. La citazione seguente è tratta dalla pagina man del file BSD 5.11, datata 17 ottobre 2011.
Normalmente, il file tenta solo di leggere e determinare il tipo di file di argomenti i cui report stat (2) sono file ordinari. Questo evita problemi, perché la lettura di file speciali può avere conseguenze peculiari. Se si specifica l' -s
opzione, il file legge anche i file degli argomenti che sono file speciali a blocchi o caratteri. Ciò è utile per determinare i tipi di file system dei dati nelle partizioni del disco non elaborate, che sono file speciali a blocchi. Questa opzione fa sì che il file ignori la dimensione del file come riportato da stat (2) poiché su alcuni sistemi riporta una dimensione zero per le partizioni del disco non elaborate.
strace file /proc/version
oltrace -S /proc/version
, l'ottimizzazione è piuttosto piccola. Fastat()
prima una chiamata e scopre che la dimensione è 0, saltando cosìopen()
- ma prima sta caricando diversi file magici.