Cosa sono i descrittori di file, spiegati in termini semplici?

  1. Quale sarebbe una descrizione più semplificata dei descrittori di file rispetto a quella di Wikipedia? Perché sono richiesti? Di ‘, prendi i processi shell come esempio e come si applica?

  2. Una tabella di processo contiene più di un descrittore di file. Se sì, perché?

In parole semplici, quando apri un file, il sistema operativo crea una voce per rappresentare quel file e memorizzare le informazioni su quel file aperto. Quindi se ci sono 100 file aperti nel tuo sistema operativo allora ci saranno 100 voci nel sistema operativo (da qualche parte nel kernel). Queste voci sono rappresentate da numeri interi come (… 100, 101, 102 ….). Questo numero di voce è il descrittore del file. Quindi è solo un numero intero che rappresenta univocamente un file aperto nel sistema operativo. Se il processo apre 10 file, la tabella dei processi avrà 10 voci per i descrittori di file.

Allo stesso modo, quando apri un socket di rete, viene rappresentato anche da un numero intero e si chiama Socket Descriptor. Spero che tu capisca.

Un descrittore di file è un handle opaco che viene utilizzato nell’interfaccia tra l’utente e lo spazio del kernel per identificare le risorse di file / socket. Pertanto, quando si utilizza open() o socket() (chiamate di sistema per interfacciare il kernel), viene fornito un descrittore di file, che è un numero intero (in realtà è un indice nella struttura dei processi u), ma ciò non è importante ). Pertanto, se si desidera interfacciare direttamente con il kernel, utilizzando le chiamate di sistema a read() , write() , close() ecc., L’handle che si utilizza è un descrittore di file.

C’è un livello di astrazione sovrapposto alle chiamate di sistema, che è l’interfaccia stdio . Ciò fornisce più funzionalità / funzionalità rispetto alle chiamate di sistema di base. Per questa interfaccia, l’handle opaco che ottieni è un FILE* , che viene restituito dalla chiamata fopen() . Ci sono molte molte funzioni che usano l’interfaccia stdio fprintf() , fscanf() , fclose() , che sono lì per semplificarti la vita. In C, stdin , stdout e stderr sono FILE* , che in UNIX si associano rispettivamente ai descrittori di file 0 , 1 e 2 .

Ascoltalo da Horse’s Mouth: APUE (Richard Stevens).
Al kernel, tutti i file aperti sono definiti da Descrittori di file. Un descrittore di file è un numero non negativo.
Quando apriamo un file esistente o creiamo un nuovo file, il kernel restituisce un descrittore di file al processo. Il kernel mantiene una tabella di tutti i descrittori di file aperti, che sono in uso. L’assegnazione dei descrittori di file è generalmente sequenziale e vengono assegnati al file come il successivo descrittore di file libero dal pool di descrittori di file liberi. Quando chiudiamo il file, il descrittore di file viene liberato ed è disponibile per ulteriori assegnazioni.
Vedi questa immagine per maggiori dettagli:
Due processi

Quando vogliamo leggere o scrivere un file, identifichiamo il file con il descrittore di file che è stato restituito dalla chiamata di funzione open () o create () , e lo usiamo come argomento su read () o write () .
Per convenzione, le shell di sistema UNIX associano il descrittore di file 0 con l’ input standard di un processo, il descrittore di file 1 con output standard e il descrittore di file 2 con errore standard .
Il descrittore di file va da 0 a OPEN_MAX.
Per ulteriori informazioni, consultare il terzo capitolo di APUE Book.

In aggiunta ad altre risposte, unix considera tutto come un file system. La tastiera è un file letto solo dal punto di vista del kernel. Lo schermo è un file di sola scrittura. Allo stesso modo, anche le cartelle, i dispositivi di input-output ecc. Sono considerati file. Ogni volta che viene aperto un file, diciamo quando i driver di dispositivo [per i file di dispositivo] richiedono un open (), o un processo apre un file utente il kernel alloca un descrittore di file, un intero che specifica l’accesso a quel file come se fosse di sola lettura , scrivi solo ecc. [per riferimento: https://en.wikipedia.org/wiki/Everything_is_a_file ]

Più punti riguardo il File Descriptor :

  1. File Descriptors (FD) sono numeri interi non negativi (0, 1, 2, ...) associati ai file che vengono aperti.

  2. 0, 1, 2 sono FD standard che corrisponde a STDIN_FILENO , STDOUT_FILENO e STDERR_FILENO (definito in unistd.h ) aperto per impostazione predefinita per conto di shell all’avvio del programma.

  3. Gli FD vengono allocati nell’ordine sequenziale, ovvero il valore intero non allocato più basso ansible.

  4. Gli FD per un particolare processo possono essere visti in /proc/$pid/fd (su sistemi basati su Unix).

Qualsiasi sistema operativo ha processi (p) in esecuzione, ad esempio p1, p2, p3 e così via. Generalmente, ogni processo fa un uso continuo dei file.

Ogni processo è costituito da un albero del processo (o una tabella del processo, in un’altra frase).

Di solito, i sistemi operativi rappresentano ciascun file in ogni processo di un numero (vale a dire, in ogni albero di processo / tabella).

Il primo file utilizzato nel processo è file0 , il secondo è file1 , il terzo è file2 e così via.

Qualsiasi numero di questo tipo è un descrittore di file.

I descrittori di file sono in genere numeri interi (0, 1, 2 e non 0,5, 1,5, 2,5).

Dato che spesso descriviamo i processi come “tabelle di processo” e dato che le tabelle hanno righe (voci), possiamo dire che la cella del descrittore di file in ogni voce, usa per rappresentare l’intera voce.

In modo simile, quando apri un socket di rete, ha un descrittore di socket.

In alcuni sistemi operativi, è ansible esaurire i descrittori di file, ma tale caso è estremamente raro e l’utente medio del computer non dovrebbe preoccuparsi di ciò.

I descrittori di file potrebbero essere globali (il processo A inizia in dire 0 e termina dice in 1; il processo B inizia a dire in 2 e termina dice in 3) e così via, ma per quanto ne so, di solito nei moderni sistemi operativi, file i descrittori non sono globali e sono in effetti specifici del processo (il processo A inizia in dire 0 e termina dice in 5, mentre il processo B inizia in 0 e termina dice in 10).

Descrittori di file (FD):

  • In Linux / Unix , tutto è un file. File regolari, directory e anche dispositivi sono file. Ogni file ha un numero associato chiamato File Descriptor (FD).
  • Lo schermo ha anche un descrittore di file. Quando viene eseguito un programma, l’output viene inviato a File Descrittore dello schermo e viene visualizzato l’output del programma sul monitor. Se l’output è inviato a File Descriptor della stampante, l’output del programma sarebbe stato stampato.

    Errore di reindirizzamento:
    Ogni volta che si esegue un programma / comando sul terminale, 3 file sono sempre aperti

    1. input standard
    2. uscita standard
    3. errore standard.

    Questi file sono sempre presenti ogni volta che viene eseguito un programma. Come spiegato prima di un descrittore di file, è associato a ciascuno di questi file.
    File File Descriptor
    Ingresso standard STDIN 0
    Uscita standard STDOUT 1
    Errore standard STDERR 2

  • Ad esempio, durante la ricerca di file, in genere si ricevono errori di authorization negati o altri tipi di errori. Questi errori possono essere salvati in un determinato file.
    Esempio 1

$ ls mydir 2> errorsfile.txt

Il descrittore di file per errore standard è 2.
Se non esiste alcuna directory denominata come mydir, l’output del comando verrà salvato nel file errorfile.txt
Usando “2>” reindirizziamo l’output dell’errore a un file chiamato “errorfile.txt”
Pertanto, l’output del programma non è ingombro di errori.

Spero tu abbia la tua risposta.

I descrittori di file sono i descrittori di un file. Forniscono collegamenti a un file. Con l’aiuto di loro possiamo leggere, scrivere e aprire un file.