2011-03-07 13 views
11

Se sto leggendo un file memorizzato su un filesystem NTFS, e provo a spostare/rinominare quel file mentre è ancora in lettura, non posso farlo. Se provo questo su un filesystem UNIX come EXT3, ha esito positivo e il processo di lettura non viene modificato. Posso anche recuperare il file e i processi di lettura non sono interessati. Come funziona? Qualcuno potrebbe spiegarmi perché questo comportamento è supportato dai filesystem UNIX ma non da NTFS? Ho una vaga sensazione che abbia a che fare con gli hard link e gli inode, ma apprezzerei una buona spiegazione.Come funzionano i comandi UNIX mv e rm con i file aperti?

risposta

23

file system Unix usano il conteggio dei riferimenti e un'architettura a due strati per la ricerca di file.

Il nome si riferisce a qualcosa chiamato inode, per il nodo o nodo informazioni di indice. I negozi di inode (un puntatore a) il contenuto del file e alcuni metadati, come il tipo del file (ordinario, directory, dispositivo, ecc.) E chi lo possiede.

Più nomi di file possono fare riferimento allo stesso inode; vengono quindi chiamati hard links. Inoltre, un file descriptor (fd) si riferisce ad un inode. Un fd è il tipo di oggetto che un processo ottiene quando apre un file.

Un file in un filesystem Unix scompare solo quando non c'è più l'ultimo riferimento ad esso, in modo che quando non ci sono più nomi (hard link) o FD di riferimento a esso. Quindi, rm in realtà non rimuove un file; si rimuove un riferimento a un file.

Questa installazione del file system può sembrare confusa e talvolta pone problemi (specialmente con NFS), ma ha il vantaggio che il blocco non è necessario per molte applicazioni. Molti programmi Unix sfruttano la situazione a loro vantaggio aprendo un file temporaneo e cancellandolo immediatamente dopo. Non appena terminano, anche se si bloccano, il file temporaneo è sparito.

+0

ci sono limitazioni a cui posso spostare un file aperto? Per esempio. solo all'interno dello stesso filesystem? –

+0

@ivan_pozdeev facendo un 'mv' su un file in diversi file system in realtà copia i dati su e cancella il file originale, in questo caso è simile a un' rm' del file aperto. – dsonck92

4

Su unix, un nome file è semplicemente un collegamento al file effettivo (inode). L'apertura di un file crea anche un collegamento (temporaneo) al file attuale. Quando tutti i collegamenti a un file sono scomparsi (rm e close()), il file viene rimosso.

Su NTFS, il nome file corrisponde al file. Non esiste un livello di riferimento indiretto dal nome del file al metainfo del file, sono lo stesso oggetto. Se lo apri, è in uso e non può essere rimosso, proprio come il file reale (inode) su unix non può essere rimosso mentre è in uso.

Unix: Nome file -> FileInfo -> File di dati

NTFS: FileName/FileInfo -> File di dati