it-swarm.it

Comprensione / dev e relativi sottodirectory e file

$ 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 in /dev e le sue sottodirectory sono tutti descrittori di file dei dispositivi?
  2. Perché ci sono così tanti link l'uno dall'altro? Per esempio, /dev/fd/0, /dev/stdin, /proc/self/fd/0 sono tutti i collegamenti a /dev/pts/2.
  3. Se l in lrwx------ significa collegamento, cosa significa c in crw--w---- significare?
55
Tim

Quasi tutti i file in /dev sono file del dispositivo . Mentre la lettura e la scrittura su un normale file memorizza i dati su un disco o su un altro file system, 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 dispositivo: blocca dispositivi (indicato da b come primo carattere nell'output di ls -l) e dispositivi a caratteri (indicati 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 es. Viene emesso su una linea seriale) e la lettura di un byte ha anche un effetto immediato (ad es. Viene letto dalla porta seriale).

Il significato di un file del 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 nel ls -l elenco, dove normalmente troverai le dimensioni del file. Per 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 ai 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 utile negli script Shell, quando si desidera ignorare l'output di un comando (>/dev/null) oppure esegui 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. Per esempio, /dev/stdin indica 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 simile, /dev/tty indica 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 piuttosto 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 In che modo/dev/fd si collega a/proc/self/fd /? .

Troverai una serie di link simbolici sotto /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. Per 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 a /dev/sr0 o potrebbe essere un collegamento a /dev/sr1 se hai due lettori CD e il secondo deve essere il lettore DVD predefinito.

Infine, ci sono alcuni altri file che potresti trovare in /dev, per motivi tradizionali. Non troverai lo stesso su tutti i sistemi. Nella maggior parte dei computer, /dev/log è un socket che i programmi usano per emettere i messaggi di registro. /dev/MAKEDEV è uno script che crea voci in /dev. Sui moderni sistemi Linux, voci in /dev/ vengono creati automaticamente da dev , obsoleto MAKEDEV.

¹ Questo in realtà non è più vero sotto Linux, ma questo dettaglio è importante solo per gli autori di driver di dispositivo.

  1. Sì - direttamente o come symlink - ecco cosa /dev/ è per.
  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 fa non punto staticamente a /dev/pts/2 o qualsiasi altro: passa a un altro terminale e vedrai. /dev/stdin è l'input standard della tua sessione terminale corrente. Questo è anche un esempio del motivo per cui deve essere un collegamento simbolico.
  3. Vedi man mknod e info coreutils 'mknod invocation'. In generale, c sta per un tipo di dispositivo chararacter.
14
rozcietrzewiacz

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

Tali file sono associati al driver che gestisce il dispositivo utilizzando numeri maggiori e minori. (Ad esempio, "136, 2" nell'output ls 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 del 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.

11
rulingminds