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 statad 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/bashe "file virtuali" come /proc/cpuinfoma lssegnala 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 procfsmentre si /bin/bashtrova 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 fileche 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_openviene chiamata e le informazioni sulla memoria vengono aggiornate.