Linux-Unlink-Funktion und wie man Dateien löscht

Linux-Unlink-Funktion und wie man Dateien löscht

1. Unlink-Funktion

Bei Hardlinks wird mit „unlink“ der Verzeichniseintrag gelöscht und die Inode-Referenzanzahl um 1 reduziert. Diese beiden Schritte sind ebenfalls ein atomarer Prozess. Die Datei wird erst dann tatsächlich gelöscht, wenn der Inode-Referenzzähler 0 erreicht.

Bei Softlinks löscht die Funktion „Unlink“ den Softlink direkt, ohne die Datei zu beeinflussen, auf die der Softlink verweist.

Funktionsprototyp:

int unlink(const char *pathname);

Parameterbeschreibung:

Pfadname: Gibt die zu entfernende Linkdatei an

Beschreibung des Rückgabewerts:

Gibt 0 zurück, wenn erfolgreich; gibt -1 zurück, wenn fehlgeschlagen und setzt errno auf den entsprechenden Wert

2. Experimenteller Code – myunlink

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]){ 
 //Erstellen Sie einen Verzeichniseintrag (Hardlink) für eine vorhandene Datei
 wenn (link(argv[1], argv[2]) == -1) {
 perror("Linkfehler");
 Ausgang (1);
 }
 //Lösche den vorherigen Dateiverzeichniseintrag if (unlink (argv [1]) == -1) {
 perror("Fehler beim Aufheben der Verknüpfung");
 Ausgang (1);
 }
 gebe 0 zurück;
}

Wenn wir den Befehl ./myunlink hellotest ausführen, wird hellotest gelöscht und der Inode-Referenzzähler um 1 reduziert.

3. Dateien löschen

Es versteht sich von selbst, dass meiner Meinung nach jeder den Befehl rm -rf verwendet hat.

Lassen Sie uns noch einmal darüber nachdenken. Haben Sie sich beim Löschen von Dateien mit dem Befehl rm jemals gefragt, ob die Dateien wirklich gelöscht wurden?

Wenn sie gelöscht werden können, wie löscht das Betriebssystem die Dateien?

Bei der Entwicklung des Betriebssystems wird die Inode-Indexnummer der Datei dem Block auf der Festplatte zugeordnet, sodass wir den Speicherort des Blocks über die Datei finden und die Daten der Datei anzeigen können.

Beim Löschen einer Datei wird dies durch zwei Systemvariablen gesteuert: i_link, das die Anzahl der Hardlinks zur Datei angibt, und i_count, das die Referenzanzahl der Datei angibt. Die notwendigen Bedingungen zum Löschen einer Datei sind i_link = 0 und i_count = 0.

Für Dateien auf der Festplatte müssen wir nur i_link = 0 setzen (Anzahl der Hardlinks löschen), um die Datei zu löschen. Wenn die Datei in einem Programm geöffnet ist, müssen wir auch i_count = 0 des laufenden Programms löschen, um den Zweck des Löschens der Datei zu erreichen.

4. Der allgemeine Vorgang zum Löschen von Dateien unter Linux

Der Dateilöschvorgang unter Linux läuft ungefähr wie folgt ab:

這里寫圖片描述

Abbildung 1 - Der allgemeine Prozess der Dateilöschung unter Linux

Auf der aktuellen Festplatte befindet sich im Verzeichnis /test/file eine Testdatei (i_link = 1) und eine Hardlink-Datei hard_link, die auf die Testdatei verweist (i_link = 1), und der Prozess ./test hat die Testdatei geöffnet (i_count = 1). Wenn Sie die Datei test.txt löschen möchten, müssen Sie den Prozess ./test beenden (i_count = 0) und dann die Hardlink-Hardlink-Datei hard_link und die Datei test.txt im Verzeichnis /test/file löschen (d. h. i_link = 0 setzen).

Das heißt, unter Linux wird das Löschen von Dateien durch die Anzahl der Links gesteuert. Wenn der Link einer Datei = 0 ist, wird die Datei gelöscht. Im Allgemeinen hat eine Datei zwei Linkzähler, i_link und i_count.

i_count ist der Referenzzähler der vom aktuellen Prozess geöffneten Datei und i_link ist die Anzahl der Dateilinks. i_count kann als Zähler der Datei im Speicher verstanden werden und i_link ist ein Zähler auf der Festplatte. Beim Befehl „rm“ wird die i_link-Anzahl der Datei auf der Festplatte tatsächlich auf 0 gesetzt. Wenn eine Datei von einem Prozess verwendet wird und der Benutzer den Befehl rm ausführt, um die Datei zu löschen, kann das Programm trotzdem normal ausgeführt werden und die korrekten Daten aus der Datei lesen. Dies liegt daran, dass der Befehl rm nur i_link auf 0 setzt (er trennt die Verbindung zwischen der Datei und dem Inode und löscht nicht den Inode und den Blockdatenblock auf der Festplatte. Wenn der Prozess zu diesem Zeitpunkt gestoppt wird, können die gelöschten Daten abgerufen werden. Wenn der Prozess Daten schreibt, werden die Daten im Festplattenblock durch die vom Prozess geschriebenen Daten überschrieben und die Originaldaten können nicht wiederhergestellt werden).

Der Prozess verweist immer noch auf die Datei i_count = 1. Durch Ausführen des Befehls rm wird die Datei nicht wirklich gelöscht. Wenn Sie die Datei löschen möchten, müssen Sie den Prozess den Referenzzähler der Datei freigeben lassen, d. h. den Prozess beenden, damit die Datei wirklich gelöscht wird.

Werden die Dateien trotzdem wirklich gelöscht? Wir haben bereits erwähnt, dass die Daten einer Datei in Blöcken auf der Festplatte gespeichert sind. Wenn wir die Daten in einer Datei suchen möchten, können wir die Blöcke auf der Festplatte nicht direkt finden, da sich zu viele Blöcke auf der Festplatte befinden. Woher wissen Sie, in welchem ​​Block Ihre Daten gespeichert sind?

Angenommen, Sie löschen versehentlich sehr wichtige Daten. Das bedeutet, dass Ihre Daten nie wiederhergestellt werden können und somit ein irreparabler Verlust entsteht. Dies zeigt, wie wichtig die Daten sind, daher wird das Betriebssystem sie nicht einfach von der Festplatte löschen.

Wenn Sie dies sehen, haben Sie, glaube ich, verstanden, dass der sogenannte Löschvorgang per Rechtsklick tatsächlich nur die Inode-Indexnummer der Datei vom Block auf der Festplatte trennt, die Dateidaten jedoch nicht wirklich gelöscht werden. Wenn Sie die Daten wirklich löschen möchten, können Sie entweder die Festplatte formatieren oder die Originaldaten löschen und dann neue Daten schreiben, um sie zu überschreiben. Natürlich können Sie die Daten auch formatieren und überschreiben, um auf Nummer sicher zu gehen. Derzeit ist es grundsätzlich sehr schwierig, Ihre Daten wiederherzustellen. Selbst wenn Sie es können, können Sie höchstens einen Teil der Daten wiederherstellen.

Wenn Sie wirklich versehentlich sehr wichtige Daten löschen, sollten Sie die Daten schnell wiederherstellen und versuchen, keine weiteren unnötigen Vorgänge durchzuführen, um den Datenverlust während des Datenwiederherstellungsprozesses zu minimieren.

5. myunlink2.c-Programm

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 /*
 Die Unlink-Funktion löscht ein Dentry
 */
int Haupt(void){
 int fd;
 char *p = "Test der Verknüpfung\n";
 char *p2 = "nachdem ich etwas geschrieben habe.\n";
 //Wenn der Prozess die Datei temp.txt öffnet, beträgt der Referenzzähler +1
 fd = öffnen("temp.txt", O_RDWR|O_CREAT|O_TRUNC, 0644);
 wenn(fd < 0){
 perror("Fehler bei offener Temperatur");
 Ausgang (1);
 }
 //Die Bedingungen zur Freigabe sind erfüllt int ret = unlink("temp.txt"); 
 wenn(ret < 0){
 perror("Fehler beim Aufheben der Verknüpfung");
 Ausgang (1);
 }
 //Schreibe den ersten String in die Datei temp.txt und bestimme anhand des Rückgabewerts, ob der Schreibvorgang erfolgreich war ret = write(fd, p, strlen(p));
 wenn (ret == -1) {
 perror("-----Schreibfehler");
 }
 printf("Hallo! Ich bin printf\n");
 //Schreibe den zweiten String in die Datei temp.txt und bestimme anhand des Rückgabewerts, ob der Schreibvorgang erfolgreich war ret = write(fd, p2, strlen(p2));
 wenn (ret == -1) {
 perror("-----Schreibfehler");
 }
 printf("Geben Sie eine beliebige Taste ein, um fortzufahren\n");
getchar();
 //Wenn „close“ fd schließt, beträgt der Referenzzähler des Prozesses für die Datei -1, wodurch die Verbindung des Prozesses zur Datei getrennt wird. close(fd);
 gebe 0 zurück;
}

Ergebnisse der Programmausführung:

這里寫圖片描述

Das Ergebnis des Programms ist dasselbe wie erwartet. Wenn das Programm ausgeführt wird, wird die Open-Funktion aufgerufen, um die Datei temp.txt zu erstellen und zu öffnen. Zu diesem Zeitpunkt erhöht sich der Referenzzähler i_count des Prozesses auf die temporäre Datei um 1, und die temporäre Datei selbst weist ebenfalls einen um 1 erhöhten i_link-Linkzähler auf.

Wenn die Unlink-Funktion aufgerufen wird, um die temporäre Datei zu löschen, wird nur die Anzahl der i_link-Links um 1 reduziert, während die Anzahl der i_count-Links des Prozesses immer noch 1 beträgt und die Verknüpfung mit der temporären Datei nicht getrennt wird. Daher kann der Prozess die Schreibfunktion aufrufen, um Daten in die temporäre Datei zu schreiben, und dies wird natürlich erfolgreich sein. Wenn das Programm endet, rufen Sie „close“ auf, um den Verweis auf die temporäre Datei zu schließen. Die temporäre Datei wird dann vom Betriebssystem gelöscht.

6. Fazit

Ohne die Prinzipien des Dateisystems zu verstehen, denken wir normalerweise, dass die Daten gelöscht wurden. Tatsächlich sind die Dateidaten auf der Festplatte noch vorhanden, aber die Verbindung zwischen dem Dentry-Verzeichnis und den Daten auf der Festplatte ist unterbrochen. Wenn wir die Daten nicht finden können, denken wir definitiv, dass sie gelöscht wurden. Solange wir jedoch einen Weg finden, die Verbindung zwischen den Daten und dem Dentry-Verzeichnis wiederherzustellen, können die gelöschten Daten wiederhergestellt werden.

Wenn wir also eine Datei löschen, bereiten wir sie gewissermaßen nur für die Freigabe vor. Wann die Freigabe erfolgt, hängt vom Betriebssystem ab.

Bei der Funktion zum Aufheben der Verknüpfung gilt: Wenn beim Löschen einer Datei die Anzahl der Hardlinks der Datei 0 erreicht und kein entsprechender Eintrag vorhanden ist, wird die Datei nicht sofort freigegeben. Das System gibt die Datei erst frei, wenn alle Prozesse, die die Datei geöffnet haben, die Datei schließen.

7. Verwenden Sie den rm-Befehl nicht leichtfertig

Ich glaube, dass Sie nach der Lektüre dieses Artikels wissen sollten, wie wichtig Daten für Computer sind, denn wenn einige wichtige Daten einmal gelöscht sind, sind sie für immer verloren. Aus diesem Grund löscht das Betriebssystem die Daten nicht direkt von der Festplatte. Das bedeutet aber nicht, dass Sie den Befehl rm unbedacht verwenden können, denn manchmal können gelöschte Daten nicht zu 100 % wiederhergestellt werden.

Zusammenfassen

Oben ist die Linux-Funktion zum Aufheben der Verknüpfung und die vom Editor eingeführte Vorgehensweise zum Löschen von Dateien beschrieben. Ich hoffe, dass sie für alle hilfreich sein wird. Vielen Dank für Ihre Unterstützung der Website 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Beispielerklärung der Alarmfunktion in Linux
  • PHP führt 6 Linux-Befehlsfunktionscodebeispiele aus
  • Detaillierte Erklärung zur Verwendung der Stat-Funktion und des Stat-Befehls in Linux
  • So erhalten Sie die aktuelle Zeit mit der Funktion time(NULL) und localtime() in Linux
  • So fügen Sie einer Python-Funktion unter Linux/Mac ein Timeout hinzu
  • Detaillierte Erklärung zur Verwendung der Linux-lseek-Funktion
  • Eine kurze Analyse des Funktionsaufrufprozesses unter der ARM-Architektur

<<:  Beispielanalyse der Verwendung gemeinsam genutzter und exklusiver Sperren in MySQL

>>:  Detaillierte Erläuterung der primitiven Werte und Referenzwerte in ECMAScript

Artikel empfehlen

Detaillierte Erklärung der globalen Variablenimplementierung von Uniapp

Vorwort In diesem Artikel werden einige Implement...

Erläuterung des MySQL-Nicht-Null-Einschränkungsfalls

Inhaltsverzeichnis Legen Sie beim Erstellen einer...

Detaillierte Erklärung des DOM DIFF-Algorithmus in der React-Anwendung

Inhaltsverzeichnis Vorwort Was ist VirtualDOM? Gr...

Vue einfache Implementierung einer Plattenspielerlotterie

In diesem Artikel wird der spezifische Code von V...

Verwendung von MySQL DDL-Anweisungen

Vorwort Die Sprachklassifikation von SQL umfasst ...

Installations-Tutorial für virtuelle VMware-Maschinen unter Ubuntu 18.04

Installationsschritte 1. Erstellen Sie eine virtu...

So ändern Sie die Farbe der gesamten Zeile (tr), wenn die Maus in HTML stoppt

Verwenden Sie reines CSS, um die Hintergrundfarbe...

Implementierung des Umschreibesprungs in Nginx

1. Neuer und alter Domain-Namenssprung Anwendungs...

So zeichnen Sie spezielle Grafiken in CSS

1. Dreieck Rahmeneinstellungen Code: Breite: 300p...

So erhalten Sie die dynamische Anzahl der verbleibenden Wörter im Textbereich

Ich bin bei der Arbeit auf einen Fall gestoßen, ü...

Einführung in geplante Aufgaben im Linux-System

Inhaltsverzeichnis 1. Planaufgaben anpassen 2. Ze...