Comprensione / dev e relativi sottodirectory e file


53
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Mi chiedevo se tutti i file sotto /deve le sue sottodirectory sono tutti descrittori di file di dispositivi?
  2. Perché ci sono così tanti link l'uno dall'altro? Ad esempio, /dev/fd/0, /dev/stdin, /proc/self/fd/0sono tutti i link a /dev/pts/2.
  3. Se lin lrwx------collegamento medio, cosa significa cin crw--w---- ?

3
E per rispondere al n. 3, la c sta per dispositivo personaggio o personaggio speciale . b sta per blocco speciale .
Felixphew,

Risposte:


79

Quasi tutti i file sotto /devsono 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 bcome 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 -lnell'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 /devnon 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/stdindesigna 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/ttydesigna il terminale a cui è collegato il processo. Sotto Linux, al giorno d'oggi, /dev/stdine 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/sr0sotto 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/sdae /dev/sda1e 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/dvdpotrebbe essere un collegamento simbolico /dev/sr0o potrebbe essere un collegamento a /dev/sr1se 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.


Grazie! Con "Il significato di un file di dispositivo è determinato dal suo numero", intendi il suo descrittore di file?
Tim

@Tim: No, i numeri compaiono ls -lnell'elenco in cui normalmente si trovano le dimensioni del file, prima della data, ad es. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ questo dispositivo è maggiore 8, minore 0. I numeri del dispositivo non compaiono spesso in pratica, li ho appena citati per dire ciò che rende un dispositivo un dispositivo (soprattutto, non è il nome del file). Un numero descrittore di file ha un significato solo in un particolare processo.
Gilles 'SO- smetti di essere malvagio' l'

No, l'apertura /dev/stdin(=> /proc/self/fd/0) su Linux non ha lo stesso effetto della duplicazione dell'input standard. Per vedere la differenza, su - non_root_userquindi exec 5</dev/stdinfallirà con "Autorizzazione negata", ma exec 5<&0avrà esito positivo. Ed è non solo che il nuovo fd verrà aperto con diverse bandiere, tutto ciò che riguarda l'oggetto file ( "file aperto descrip zione " in gergo POSIX) sarà diverso (file pointer offset, non / modalità di blocco, ecc).
mosvy,

14
  1. Sì - direttamente o come symlink - questo è ciò che /dev/serve.
  2. Per vari scopi: a volte per la compatibilità tra schemi di denominazione, a volte è necessario per l'ambiente di lavoro - come nell'esempio di /dev/stdin. Questo non punta staticamente a /dev/pts/2nessun altro - basta passare a un altro terminale e vedrai. /dev/stdinè l'input standard della sessione terminale corrente . Questo è anche un esempio del motivo per cui deve essere un collegamento simbolico.
  3. Vedi man mknode info coreutils 'mknod invocation'. In generale, csta per un tipo di dispositivo chararacter.

3
"input standard della sessione terminale corrente" è un po 'ambiguo. /dev/stdinsi riferisce allo standard input del processo che lo aprirà. Tutto /proc/$pidè in dati dipendenti dal processo ed /proc/selfè una sorta di link simbolico magico che punta ai dati propri del processo.
Stéphane Gimenez,

11

Per la tua prima domanda, non sono descrittori di file, sono file di dispositivo. (alias "nodi di sviluppo")

Tali file sono associati al driver che gestisce il dispositivo utilizzando numeri maggiori e minori. (Ad esempio, "136, 2" lsnell'output si riferisce al driver del dispositivo associato al numero principale 136 e specifica il dispositivo n. 2 gestito da quel driver.)

La prima lettera di output di ls -lè il tipo di dispositivo in caso di file di dispositivo. Se è "c" è un dispositivo a caratteri, o se è "b", è un dispositivo a blocchi.

Per la tua seconda domanda, fai riferimento alla risposta sopra di rozcietrzewiacz.


1
Il link "Introduzione ai driver di dispositivo" sembra essere rotto.
Slothworks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.