Oltre alle risposte di @ RuiFRibeiro e @ BruceEdiger, la distinzione che fai non è esattamente la distinzione che il kernel fa. In realtà, hai vari tipi di file: file regolari, directory, collegamenti simbolici, dispositivi, socket (e ne dimentico sempre alcuni, quindi non cercherò di fare un elenco completo). Puoi avere le informazioni sul tipo di un file con ls
: è il primo carattere sulla riga. Per esempio:
$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov. 08:29 /dev/sda
La "b" all'inizio indica che questo file è un dispositivo a blocchi. Un trattino, indica un file normale, "l" un collegamento simbolico e così via. Questa informazione è memorizzata nei metadati del file ed è accessibile stat
ad esempio tramite la chiamata di sistema , quindi il kernel può leggere diversamente un file e un collegamento simbolico, ad esempio.
Quindi, fai un'altra distinzione tra "file reali" come /bin/bash
e "file virtuali" come /proc/cpuinfo
ma ls
segnala entrambi come file normali, quindi la differenza è di un altro tipo:
ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root 829792 24 août 10:58 /bin/bash
-r--r--r-- 1 root wheel 0 20 nov. 16:50 /proc/cpuinfo
Quello che succede è che appartengono a diversi filesystem. /proc
è il punto di montaggio di uno pseudo-filesystem procfs
mentre si /bin/bash
trova su un normale filesystem su disco. Quando Linux apre un file (lo fa in modo diverso a seconda del filesystem), popola una struttura di dati file
che ha, tra gli altri attributi, una struttura di diversi puntatori di funzioni che descrivono come usare questo file. Pertanto, può implementare comportamenti distinti per diversi tipi di file.
Ad esempio, queste sono le operazioni pubblicizzate da /proc/meminfo
:
static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}
static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
Se osservi la definizione di meminfo_proc_open
, puoi vedere che questa funzione popola un buffer in memoria con le informazioni restituite dalla funzione meminfo_proc_show
, il cui compito è quello di raccogliere dati sull'utilizzo della memoria. Queste informazioni possono quindi essere lette normalmente. Ogni volta che si apre il file, la funzione meminfo_proc_open
viene chiamata e le informazioni sulla memoria vengono aggiornate.