Descrittore di file

Aggiornato il: 13/03/2021 da Computer Hope

Descrittori di file illustrazione

Un descrittore di file è un numero che identifica in modo univoco un file aperto nel sistema operativo di un computer. Descrive una risorsa di dati e come è possibile accedere a tale risorsa.

Quando un programma chiede di aprire un file — o un’altra risorsa dati, come un socket di rete — il kernel:

  1. concede l’accesso.
  2. Crea una voce nella tabella dei file globali.
  3. Fornisce al software la posizione di quella voce.

Il descrittore è identificato da un numero intero non negativo univoco, ad esempio 0, 12 o 567. Esiste almeno un descrittore di file per ogni file aperto sul sistema.

I descrittori di file sono stati utilizzati per la prima volta in Unix e sono utilizzati dai moderni sistemi operativi tra cui Linux, macOS e BSD. In Microsoft Windows, i descrittori di file sono noti come handle di file.

Panoramica

Quando un processo fa una richiesta di apertura di un file, il kernel restituisce un descrittore di file che punta a una voce nella tabella globale dei file del kernel. La voce della tabella file contiene informazioni come l’inode del file, l’offset dei byte e le restrizioni di accesso per quel flusso di dati (sola lettura, sola scrittura, ecc.).

descrittore di File schema

Stdin, stdout e stderr

un sistema operativo Unix-like, i primi tre descrittori di file per impostazione predefinita, sono STDIN (standard input), STDOUT (standard output), e STDERR (errore standard).

Nome descrittore di File Descrizione Abbreviazione
input Standard 0 predefinita flusso di dati di input, per esempio, in una pipeline di comandi. Nel terminale, questo valore predefinito è l’input da tastiera dell’utente. stdin
Standard output 1 Il flusso di dati predefinito per l’output, ad esempio quando un comando stampa del testo. Nel terminale, questo valore predefinito è lo schermo dell’utente. stdout
Errore standard 2 Il flusso di dati predefinito per l’output relativo a un errore. Nel terminale, questo valore predefinito è lo schermo dell’utente. stderr

Reindirizzamento dei descrittori di file

È possibile accedere direttamente ai descrittori di file utilizzando bash, la shell predefinita del sottosistema Linux, macOS X e Windows per Linux.

Ad esempio, quando si utilizza il comando find, l’output di successo va a stdout (descrittore di file 1) e i messaggi di errore vanno a stderr (descrittore di file 2). Entrambi i flussi vengono visualizzati come output del terminale:

find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something

Riceviamo errori perché find sta cercando di cercare alcune directory di sistema che non abbiamo il permesso di leggere. Tutte le righe che dicono “Permesso negato” sono state scritte su stderr e le altre righe sono state scritte su stdout.

Puoi nascondere stderr reindirizzando il descrittore di file 2 a/dev/null, il dispositivo speciale in Linux che “non va da nessuna parte”:

find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

Gli errori inviati a/dev / null, e non vengono visualizzati.

Capire la differenza tra stdout e stderr è importante quando si desidera lavorare con l’output di un programma. Ad esempio, se si tenta di grep l’output del comando find, si noterà i messaggi di errore non vengono filtrati, perché solo l’output standard viene convogliato in grep.

find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something

Tuttavia, è possibile reindirizzare standard errore standard output, e quindi grep elaborerà il testo di entrambi:

find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

si Noti che il comando di cui sopra, il target descrittore di file (1) è preceduto da una e commerciale (“&”). Per ulteriori informazioni sul reindirizzamento del flusso di dati, vedere pipeline nella shell bash.

Per esempi di creazione e utilizzo di descrittori di file in bash, vedere i nostri esempi di comandi incorporati exec.

File handle, termini del sistema operativo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.