Quasi tutti i file sotto /dev
sono file di dispositivo . Mentre la lettura e la scrittura su un normale file memorizza i dati su un disco o su un altro filesystem, l'accesso a un file del dispositivo comunica con un driver nel kernel, che generalmente a sua volta comunica con un pezzo di hardware (un dispositivo hardware, da cui il nome).
Esistono due tipi di file di dispositivo: dispositivi a blocchi (indicato da b
come primo carattere nell'output di ls -l
) e dispositivi a caratteri (indicato da c
). La distinzione tra dispositivi a blocchi e caratteri non è del tutto universale. I dispositivi a blocchi sono cose come i dischi, che si comportano come file di dimensioni fisse di grandi dimensioni: se si scrive un byte a un determinato offset e successivamente si legge dal dispositivo a tale offset, si ottiene quel byte indietro. I dispositivi a caratteri sono praticamente qualsiasi altra cosa, in cui la scrittura di un byte ha un effetto immediato (ad esempio, viene emessa su una linea seriale) e la lettura di un byte ha anche un effetto immediato (ad esempio, viene letto dalla porta seriale).
Il significato di un file di dispositivo è determinato dal suo numero, non dal suo nome (il nome è importante per le applicazioni, ma non per il kernel). Il numero è in realtà due numeri: il numero principale indica quale driver è responsabile di questo dispositivo e il numero minore consente a un driver di guidare diversi dispositivi¹. Questi numeri compaiono ls -l
nell'elenco, dove normalmente si trovano le dimensioni del file. Ad esempio brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ questo dispositivo è maggiore 8, minore 0.
Alcuni file di dispositivo in /dev
non corrispondono a dispositivi hardware. Uno che esiste su ogni sistema unix è /dev/null
; scrivere su di esso non ha alcun effetto e la lettura da esso non restituisce mai alcun dato. È spesso conveniente negli script di shell, quando si desidera ignorare l'output di un comando ( >/dev/null
) o eseguire un comando senza input ( </dev/null
). Altri esempi comuni sono /dev/zero
(che restituisce byte nulli all'infinito ) /dev/urandom
(che restituisce byte casuali all'infinito ).
Alcuni file di dispositivo hanno un significato che dipende dal processo a cui accede. Ad esempio, /dev/stdin
designa l'input standard del processo corrente; L'apertura da ha circa lo stesso effetto dell'apertura del file originale che è stato aperto come input standard del processo. In qualche modo allo stesso modo, /dev/tty
designa il terminale a cui è collegato il processo. Sotto Linux, al giorno d'oggi, /dev/stdin
e gli amici non sono implementati come dispositivi a caratteri, ma invece come collegamenti simbolici a un meccanismo più generale che consente di fare riferimento a ogni descrittore di file (al contrario di solo 0, 1 e 2 con il metodo tradizionale); per esempio /dev/stdin
è un collegamento simbolico a /proc/self/fd/0
. Vedi Come si collega / dev / fd a / proc / self / fd /? .
Sotto troverai un numero di collegamenti simbolici /dev
. Ciò può verificarsi per motivi storici: un file di dispositivo è stato spostato da un nome a un altro, ma alcune applicazioni utilizzano ancora il vecchio nome. Ad esempio, /dev/scd0
è un collegamento simbolico a /dev/sr0
sotto Linux; entrambi designano il primo dispositivo CD. Un altro motivo per i collegamenti simbolici è l'organizzazione: sotto Linux, troverai i tuoi dischi rigidi e le partizioni in diversi punti: /dev/sda
e /dev/sda1
e amici (ogni disco designato da una lettera arbitraria e partizioni in base al layout della partizione), /dev/disk/by-id/*
(dischi designati da un numero seriale univoco), /dev/disk/by-label/*
(partizioni con un filesystem, designate da un'etichetta scelta dall'uomo); e altro ancora I collegamenti simbolici vengono utilizzati anche quando il nome di un dispositivo generico potrebbe essere uno dei tanti; per esempio/dev/dvd
potrebbe essere un collegamento simbolico /dev/sr0
o potrebbe essere un collegamento a /dev/sr1
se si dispone di due lettori CD e il secondo è il lettore DVD predefinito.
Infine, ci sono alcuni altri file che potresti trovare sotto /dev
, per motivi tradizionali. Non troverai lo stesso su tutti i sistemi. Nella maggior parte dei computer portatili, /dev/log
è un socket utilizzato dai programmi per emettere i messaggi di registro. /dev/MAKEDEV
è uno script che crea voci in /dev
. Sui moderni sistemi Linux, le voci in /dev/
vengono create automaticamente da udev , obsolete MAKEDEV
.
¹ Questo in realtà non è più vero sotto Linux, ma questo dettaglio è importante solo per gli autori di driver di dispositivo.