Qual è la durata di un descrittore di file?


11

Come descritto qui , i reindirizzamenti usano open()per scrivere su un file. C'è un descrittore di file interno (?) Creato nella shell e quindi usato quando necessario.

Il descrittore interno è stato creato per l'intera durata dello script o della durata della shell? Viene distrutto dopo un po 'di tempo, una serie di operazioni, ecc.?

Intendo in particolare i descrittori di file per i file che la shell stessa apre per le operazioni dei suoi builtin. Il descrittore è stato creato e il file è stato aperto per ogni operazione? Per quanto tempo sono tenuti? Esempio:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

La prima istanza del descrittore viene mantenuta fino alla seconda operazione?

E la shell che uso in un terminale? A volte tengo aperta una sessione per giorni, forse anche settimane. Mantiene ancora i descrittori per tutti i file su cui ho operato con i built-in della shell?

Risposte:


4

In breve: una shell quasi sicuramente chiuderà i descrittori di file relativi ai reindirizzamenti immediatamente dopo il completamento del comando.


Dettagli: non si fa menzione esplicita della chiusura dei file aperti tramite reindirizzamenti in POSIX (per quanto posso vedere). Ma non chiuderli immediatamente non sarebbe molto utile.

Le regole per l'ambiente in cui vengono avviati i comandi non consentono il passaggio di descrittori di file aggiuntivi. La shell dovrebbe aver cura di chiudere eventuali FD extra che viene salvata quando si avvia un comando che non dovrebbe averli.

Per i soliti > filenamereindirizzamenti di output, nel caso in cui fosse necessario salvare il descrittore di file, il file dovrebbe essere troncato all'avvio di ciascun comando. E qualsiasi descrittore di file salvato indicherebbe un file errato se il file in questione fosse rinominato o rimosso nel frattempo.

Ad esempio, questo non si comporterebbe correttamente se il fd aperto per il primo echofosse tenuto aperto e usato così com'è per il secondo:

echo foo >> x; mv x y; echo bar >> x

Il solito modello fork + exec utilizzato per l'avvio di programmi esterni semplifica inoltre la chiusura automatica dei file alla chiusura del comando. La shell deve solo fork()prima aprire tutti i file necessari nel processo figlio, prima di chiamare exec()per sostituire il figlio con il comando effettivo. Quando il processo figlio termina, tutti i file aperti da esso vengono chiusi automaticamente.


Inawk , però, la sintassi per il reindirizzamento output è simile al guscio, ma i file aperti sono tenute aperte fino alle uscite di script, se non esplicitamente chiuso. Questo si aprirà solo una foovolta e non lo troncerà tra le stampe:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

Sono chiusi al termine. La shell creerà 3 descrittori di file 0,1,2 per ciascun comando che esegue. Questi sono solo numeri, i numeri vengono riutilizzati. La shell chiuderà i file prima di riutilizzare i descrittori.

I descrittori di file vengono inoltre passati ad altri processi. E se hai un processo in background, avrà comunque descrittori di file.

L'esempio utilizza 3>&1, questo significa fare in modo che il descrittore di file 3 faccia riferimento al file a cui attualmente fa riferimento il descrittore 1.

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.