Déplacement d'un fichier en cours d'utilisation - Comment ça marche?

29

J'ai remarqué que, sur les systèmes d'exploitation autres que Windows ... c.-à-d. Linux / mac, je peux faire des choses comme: - Envoyer un zip à un ami par dessus le but - Supprimer le fichier en cours de transfert

Et le transfert n'échoue pas.

Ou, je peux faire des opérations comme .. - commencer un film - effacer le fichier - le film joue toujours jusqu'à la fin (lu à partir du disque, pas seulement en mémoire tampon)

Bien que les fichiers soient "supprimés", comme je l'ai mentionné, ils sont en fait déplacés vers un emplacement différent du système de fichiers ... c'est-à-dire un répertoire Corbeille ou quelque chose du genre. Il me semble donc que le système d'exploitation utilise un pointeur @ le fichier qui est mis à jour lorsqu'il se déplace plutôt que d'accéder directement aux fichiers.

Quelqu'un peut-il nous éclairer sur la manière dont cette capacité IMPRESSIONNANTE est réellement mise en œuvre? Je ne sais même pas quoi chercher sur Google pour en savoir plus.

Je vous remercie.

Mario Zigliotto
la source
1
En théorie, je suppose que cela pourrait se produire de deux manières. Les deux sont la réalité. Le fichier est en mémoire. Ou le système de fichiers a des références aux fichiers et seule la référence est supprimée. Les deux sont la réalité. Le fait de référence est la façon dont les programmes non supprimés peuvent restaurer des choses. L'idée que le fichier est réellement supprimé lorsque tous les programmes qui l'acceptent se ferme ressemble à un non-sens. Vous pouvez rechercher des listes chaînées (une structure de données de programmation, pour comprendre le concept plus en profondeur). Ou vous pouvez rechercher des systèmes de fichiers particuliers.
barlop

Réponses:

27

L'entrée de répertoire est juste un pointeur sur un inode. L'inode contient les méta-informations sur le fichier (autres que le nom) et des pointeurs sur les données du fichier (le cas échéant). Lorsque vous commencez à copier un fichier, vous obtenez un descripteur sur l’inode.

Le système d'exploitation conserve un nombre de références à l'inode. Tant qu'il y a des références à l'inode, l'inode et les données du fichier sont conservés. Une fois que toutes les références à l'inode sont supprimées, l'inode l'est et l'espace nécessaire au fichier est libéré.

Lorsque le fichier est ouvert pour la copie, il sera conservé jusqu'à ce que votre processus ferme le fichier. Cela devrait se produire une fois le transfert de fichier terminé et si le processus de copie échoue. Si le transfert de fichier échoue à mi-parcours et que vous avez supprimé tous les liens physiques vers le fichier, vous ne pourrez pas redémarrer le transfert.

EDIT: Comme d'autres l'ont noté, les déplacements de fichiers sur le même appareil sont effectués sans déplacer les données. À la place, une nouvelle entrée de répertoire est créée dans le répertoire de destination et l'entrée de répertoire d'origine est supprimée.

Il est possible d'avoir plusieurs entrées de répertoire pour le même fichier. Ceux-ci s'appellent des liens durs. Ils sont créés en créant une nouvelle entrée de répertoire pour le fichier sans supprimer l'entrée d'origine. L'inode du système de fichiers dispose d'un nombre de références pour enregistrer le nombre d'entrées de répertoire pointant vers le fichier.

EDIT2: Si le processus se bloque ou est tué, le fichier sera supprimé proprement car le nombre d'accès en mémoire sera réduit à zéro. C'est l'action qui se produit lorsque le programme se termine normalement.

En cas de panne de courant ou d’arrêt du système sans ordre, le disque nécessite un disque dur. fsck (vérification du système de fichiers) avant de pouvoir être entièrement monté. Selon l’état des structures d’inode et de répertoire sur le disque, l’espace sera récupéré, le fichier restera dans le répertoire ou une nouvelle entrée sera créée dans le répertoire. lost+found annuaire. Les résultats dépendent des modifications qui ont été vidées sur le disque ou écrites dans le journal des systèmes de fichiers.

BillThor
la source
4
Exactement. Je ne pourrais pas le dire mieux moi-même. Par ailleurs, une astuce courante, si vous avez besoin de stocker des fichiers de travail dans un programme, consiste à créer un fichier dans. /tmp, et immédiatement unlink(2) il. À ce stade, il n'y a pas de fichier dans un répertoire (il n'y a donc rien à nettoyer à la fermeture ou au blocage), mais votre processus a toujours accès au fichier et aucun autre processus ne peut le gêner accidentellement ou délibérément. Cela illustre la propriété d'intérêt.
Norman Gray
Cela signifie-t-il que si un fichier ouvert est supprimé pendant son utilisation par un programme et qu'une panne de courant se produit, les données bloquées resteront sur le disque occupant de l'espace? Qu'en est-il si le processus utilisant le fichier se bloque ou est tué?
Jason C
1
@JasonC J'ai mis à jour la réponse pour répondre à vos questions.
BillThor
6

Comme l'explique Matt Jenkins, le système d'exploitation (le système de fichiers) garde une trace des fichiers maintenus ouverts par les applications. Tant qu'un processus garde un fichier ouvert, ses données restent sur le disque (même s'il a été supprimé et qu'il n'est plus visible ou accessible à d'autres programmes.

Notez que la conséquence en est que l’espace occupé par un fichier ne peut être récupéré que lorsque le dernier processus l’utilisant l’a fermé. C’est une FAQ pour les opérations sur les systèmes de fichiers Linux / Unix: "La commande '' df '' indique que la partition est pleine, alors que 'du' indique l’espace disponible '" (voir par exemple, http://batleth.sapienti-sat.org/projects/FAQs/ext3-faq.html ). Si vous devez libérer de l'espace, il ne suffit pas de supprimer les gros fichiers (par exemple, les fichiers journaux), vous devez également vous assurer qu'aucun processus ne les garde ouverts (généralement un problème avec les fichiers journaux).

sleske
la source
Cela n’est pas le cas sous OS X / HFS +: vous pouvez déplacer des fichiers, par exemple. dans la corbeille, mais pas entre les partitions, ni les supprimer (c’est-à-dire vider la corbeille).
Daniel Beck
2

C'est assez simple en fait. Le fichier conserve une liste de références - processus accédant au fichier. Lorsque vous supprimez le fichier, il supprime simplement la liste du répertoire, mais pas le fichier lui-même. Les programmes qui ont toujours le fichier ouvert peuvent toujours y accéder. Le fichier n'est réellement supprimé que lorsque tous les programmes qui y ont accès le ferment.

De plus, lors du déplacement du fichier - s'il se trouve dans le même système de fichiers - le fichier ne se déplace pas en tant que tel, il change simplement le pointeur sur le répertoire dans lequel se trouve le fichier

Majenko
la source
"Le fichier maintient une liste de références"?
Daniel Beck
Devrait être le "OS ou Explorer" pas un fichier.
Moab
2
Ce serait en fait le système de fichiers.
JRobert
Le système d’exploitation utilise le système de fichiers pour stocker les références dans le fichier (nlinks dans la structure de l’en-tête du fichier).
Majenko
1
Les "références" sont des processus avec un handle ouvert vers le fichier et des liens physiques (y compris le premier nom de fichier) vers le fichier. Les blocs de données ne sont pas marqués comme étant libres et disponibles pour être réutilisés jusqu'à ce que le compte de références atteigne zéro.
mpez0
0

Dans les systèmes de fichiers Unix, un fichier peut avoir un ou plusieurs liens durs à cela. Le fichier vit tant qu'il y en a au moins un. Lorsque le dernier est supprimé, l'espace du fichier est libéré. lien ci-dessus vous donnera un point de départ pour plus de lecture - voir en particulier la section "Compteur de liens"

JRobert
la source
1
C'est vrai, mais ce n'est pas ce qui se passe ici. Le fait est que même après que le dernier lien dur soit enlevé , le fichier reste toujours jusqu’à ce que tous les processus leur aient fermé leurs descripteurs.
sleske