Come si comportano i file aperti su sistemi Linux?


17

Ho appena rinominato un file di registro in "foo.log.old" e ho ipotizzato che l'applicazione inizierà a scrivere un nuovo file di registro in "foo.log". Sono stato sorpreso di scoprire che ha tracciato il file di registro con il suo nuovo nome e ha continuato ad aggiungere righe a "foo.log.old".

In Windows, non ho familiarità con questo tipo di comportamento: non so se sia nemmeno possibile implementarlo. Come si implementa esattamente questo comportamento in Linux? Dove posso saperne di più?


Non lo sto mettendo come una risposta perché non lo so davvero, ma penso che abbia a che fare con gli inode che non vengono modificati quando si sposta un file.
mathepic,

Risposte:


20

I programmi si connettono ai file attraverso un numero gestito dal filesystem (chiamato inode sui filesystem unix tradizionali), a cui il nome è solo un riferimento (e forse non un riferimento univoco).

Quindi diverse cose da tenere presente:

  1. Lo spostamento di un file mediante mvnon modifica quel numero sottostante a meno che non lo si sposti su filesystem (che equivale a utilizzare cpquindi rmsull'originale).
  2. Poiché più di un nome può connettersi a un singolo file (ovvero abbiamo collegamenti fissi), i dati nei file "cancellati" non scompaiono fino a quando tutti i riferimenti al file sottostante non scompaiono.
  3. Forse il più importante: quando un programma è openun file fa un riferimento ad esso che è (ai fini di quando i dati saranno cancellati) equivalente ad avere un nome di file collegato ad esso.

Ciò dà origine a diversi comportamenti come:

  • Un programma può openleggere un file, ma in realtà non lo legge fino a quando l'utente non rmlo ha modificato nella riga di comando e il programma avrà comunque accesso ai dati .
  • Quello che hai riscontrato: l' mvinging un file non disconnette la relazione tra il file e tutti i programmi che lo hanno aperto (a meno che non passi attraverso i confini del filesystem, nel qual caso il programma ha ancora una versione dell'originale su cui lavorare).
  • Se un programma ha openeditato un file per la scrittura e l'utente rmè l'ultimo nome di file nella riga di comando, il programma può continuare a mettere roba nel file, ma non appena si chiude non ci sarà più riferimento a quei dati e andrà via.
  • Due programmi che comunicano attraverso uno o più file possono ottenere una sicurezza parziale e grossolana rimuovendo i file al termine opendell'operazione. (Questa non è una vera mente di sicurezza, trasforma semplicemente un buco spalancato in una condizione di razza.)

1
Sono d'accordo con @dmckee, volevo solo notare: un programma può openun file per la lettura e la scrittura (come quello che è successo con il file di registro nella domanda).
jsbillings,

@jsbillings: Sì, ma c'è un rischio. Se tutti i nomi dei filesystem sono scomparsi, puoi scrivere GB in un file aperto che evaporerà come la rugiada del mattino non appena lo chiudi.
dmckee,

1
Inoltre, l'inode viene copiato nel kernel e questo è ciò su cui viene operato, non la copia del disco. Quindi il file potrebbe essere mv'd o cp ', ma un file aperto sta già lavorando con le strutture di dati kernal, non con la versione del disco. Pertanto, se si copia un altro file nel file aperto per la scrittura, il processo continuerà a scrivere nella stessa posizione relativa del file precedente. Questo è il motivo per cui programmi, come Apache httpd, hanno un gestore di segnale che chiude e riapre i file di registro.
Arcege,

0

Per vedere davvero come viene implementato questo comportamento, puoi guardare alcuni libri di programmazione Unix. Mathepic ha ragione nel fatto che è legato a un inode. Il percorso effettivo viene utilizzato solo per aprire il file, una volta fatto il programma lo fa riferimento dal suo descrittore di file aperto. Il descrittore di file a sua volta fa riferimento all'inode, che in questo caso non importa se il nome del file sottostante è cambiato.

Per quanto riguarda l'implementazione in Windows, questa è una domanda per un altro sito.

Per saperne di più su questo senza colpire i libri basta cercare filesystem e inode di Linux. Potrebbe non esserci una risposta chiara, ma sarai in grado di capire il perché.


4
"Cerca in giro - probabilmente non troverai una buona risposta ma la capirai" non è una buona risposta.
Mattdm,
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.