Cosa succede quando leggi un file mentre viene sovrascritto?


Risposte:


19

Dipende da cosa fa lo scrittore.

Se lo scrittore sovrascrive il file esistente, il lettore vedrà il nuovo contenuto quando lo scrittore supera il lettore, se mai. Se lo scrittore e il lettore procedono a velocità variabile, il lettore può in alternativa vedere contenuti vecchi e nuovi.

Se il writer tronca il file prima che inizi a scrivere, il lettore verrà eseguito alla fine del file in quel punto.

Se il writer crea un nuovo file, quindi sposta il nuovo file sul vecchio nome, il lettore continuerà a leggere dal vecchio file. Se un file aperto viene spostato o rimosso, i processi che hanno il file aperto continuano a leggere dallo stesso file. Se il file viene rimosso, rimane effettivamente sul disco (ma senza possibilità di riaprirlo) fino a quando l'ultimo processo non lo ha chiuso.

I sistemi Unix tendono a non avere blocchi obbligatori . Se un'applicazione desidera assicurarsi che il suo componente writer e il componente reader non si pettino l'un l'altro, spetta allo sviluppatore utilizzare il blocco corretto. Ci sono alcune eccezioni in cui un file aperto dal kernel può essere protetto dalla scrittura da parte delle applicazioni dell'utente, ad esempio un'immagine del filesystem montata su loop o un eseguibile che viene eseguito su alcune varianti unix.


Gilles, la tua spiegazione si applica anche in ftp/ sftpscenari? Supponiamo che un processo inizi a leggere un ftpfile trasmesso mentre un'altra versione dello stesso file lo sovrascrive a causa di una nuova trasmissione.
Iruvar,

@ 1_CR Sì. In tal caso, lo scrittore e il lettore sono i processi ftpd.
Gilles 'SO- smetti di essere malvagio' il

qual è il significato del sorpasso qui?
Victor Choy,

Significato standard @VictorChoy: iniziare dietro / dopo qualcun altro e ad un certo punto andare avanti di loro.
Gilles 'SO- smetti di essere malvagio' il

18

È una condizione di gara classica, quindi il risultato è imprevedibile per definizione.

Tra l'altro, dipende da

  • fopen(3)o open(2)modalità di scrittura,
  • come / se lo scrittore sta bufferizzando il suo output,
  • come il lettore sta leggendo il file,
  • la differenza di velocità tra lettore e scrittore,
  • la differenza di tempo tra l'inizio della lettura e quello dello scrittore.
  • E, naturalmente, sulle moderne macchine multi-core, le cose sono ancora più complicate da altri fattori più in basso (ad es. Pianificazione dei processi).

Se devi essere in grado di leggere un file mentre viene riscritto, puoi fare in modo che il writer esegua una copia temporanea del file, modificarlo e copiarlo nuovamente nel file originale. In questo modo rsync, ad esempio. Esistono diversi modi per implementarlo, ma nessun pranzo libero. Ogni metodo ha le sue carenze e ripercussioni.


1
Questa risposta è molto più completa della mia. Cancellare la mia risposta
assassino

0

I rispondenti precedenti hanno spiegazioni più complete di così, ma ecco un trucco che funziona sicuramente anche, praticamente facendo esattamente quello che vuole:

$ tail -f <filename>

Ti mostrerà la fine del file mentre viene scritto. Comodo se si desidera reindirizzare STDERR a un file ma ancora vederlo in un'altra finestra del terminale, ad esempio.

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.