Wenn Sie eine Datei löschen, entfernen Sie wirklich einen Link zur Datei (zum Inode). Wenn jemand diese Datei bereits geöffnet hat, kann er den Dateideskriptor behalten, den er hat. Die Datei verbleibt auf der Festplatte, nimmt Speicherplatz ein und kann beschrieben und gelesen werden, wenn Sie Zugriff darauf haben.
Die unlink
Funktion wird mit diesem Verhalten von POSIX definiert:
Wenn die Anzahl der Verknüpfungen der Datei 0 wird und kein Prozess die Datei geöffnet hat, wird der von der Datei belegte Speicherplatz freigegeben und die Datei ist nicht mehr zugänglich. Wenn bei einem oder mehreren Prozessen die Datei geöffnet ist, wenn der letzte Link entfernt wird, wird der Link entfernt, bevor unlink () zurückgegeben wird. Das Entfernen des Dateiinhalts wird jedoch verschoben, bis alle Verweise auf die Datei geschlossen sind .
Dieser Ratschlag wegen dieses Verhaltens. Der Dämon hat die Datei geöffnet und bemerkt nicht, dass sie gelöscht wurde (es sei denn, er hat sie speziell überwacht, was ungewöhnlich ist). Es wird weiterhin munter in den vorhandenen Dateideskriptor geschrieben, den es hat: Sie werden weiterhin (mehr) Speicherplatz auf der Festplatte belegen, aber Sie werden keine der Nachrichten sehen können, die es schreibt, also sind Sie wirklich im schlimmsten Fall beider Welten. Wenn Sie die Datei stattdessen auf die Länge Null kürzen, wird der Speicherplatz sofort freigegeben, und alle neuen Nachrichten werden am neuen Ende der Datei angehängt, wo Sie sie sehen können.
Wenn der Dämon close
die Datei beendet oder beendet , wird der Speicherplatz freigegeben. In der Zwischenzeit kann niemand Neues die Datei öffnen (außer über systemspezifische reflektierende Schnittstellen wie Linux/proc/x/fd/...
). Es ist auch garantiert, dass:
Wenn die Verknüpfungsanzahl der Datei 0 ist und alle mit der Datei verknüpften Dateideskriptoren geschlossen sind, wird der von der Datei belegte Speicherplatz freigegeben und die Datei ist nicht mehr zugänglich.
Sie verlieren also nicht dauerhaft Speicherplatz, aber durch das Löschen der Datei erhalten Sie nichts und verlieren den Zugriff auf neue Nachrichten.
/proc/x/fd/y
? Würde dies dazu führen, dass der Prozess nicht in den Dateideskriptor schreibt, oder handelt es sich um eine unzulässige Operation?