Umbenennen von einem Dateideskriptor?

8

Eine Variante der Frage Abrufen des Dateinamens vom Dateideskriptor in C . Hier geht es um Linux.

Wenn ich einen Dateideskriptor habe, der auf eine reguläre Datei verweist, kann ich den Dateideskriptor "speichern", indem ich ihm einen neuen Dateinamen gebe (irgendwo auf dem gleichen Gerät, auf dem er natürlich lebt)? Ich suche etwas Ähnliches wie umbenennen (2) oder Verbindung (2), aber das würde einen Dateideskriptor als Eingabe anstelle eines Dateinamens annehmen.

Das Problem mit rename (2) und link (2) besteht darin, dass Sie zwar versuchen können, vom Dateideskriptor zum Dateinamen zu wechseln, dies jedoch fehlschlagen kann. Ich denke genauer über den Fall nach, in dem der geöffnete Dateideskriptor auf eine Datei verweist, die bereits nicht verknüpft war - in diesem Fall hat die Datei keinen weiteren Namen. Es scheint, dass es keine Möglichkeit gibt zu verhindern, dass die Datei gelöscht wird, wenn wir den Dateideskriptor schließen (). Aber liege ich falsch? Können wir mit der Posix- oder sogar Linux-API wieder einen Namen geben?

Update: Wir können den Inhalt einer gelöschten Datei unter Linux in /proc/<pid>/fd/<fd> sehen, obwohl er wie eine defekte symbolische Verbindung aussieht. Wir können jedoch link (2) oder ln (1) nicht verwenden, um eine solche Datei zu rematerialisieren, da sie denkt, dass wir versuchen, eine geräteübergreifende Verbindung herzustellen.

    
Armin Rigo 13.12.2012, 14:00
quelle

2 Antworten

3

Wenn die Frage über Linux und über Linux & Gt; 2.6.39 können Sie den Befehl linkat mit dem Flag AT_EMPTY_PATH verwenden, um einem Dateideskriptor einen Namen zu geben. Siehe die man-Seite ( Ссылка )

%Vor%

Vorbehalte:

  • Sie müssen _GNU_SOURCE definieren, um die Definition für AT_EMPTY_PATH ,
  • zu erhalten
  • Bei Dateien mit einer Linkanzahl von Null funktioniert das nicht garantiert. Ich bin mir nicht sicher, ob ich verstehe, was die Handbuchseite dazu sagt. Meine Vermutung ist, dass, wenn eine Datei keine Linkanzahl hat, der Inode bereits im Dateisystem gelöscht wurde, um Inkonsistenzen zu vermeiden, falls das Dateisystem abstürzen sollte.
  • Natürlich erwarte ich nicht, dass es funktioniert, wenn sich die alte Datei nicht im Zielverzeichnis auf demselben Dateisystem befindet.

Wenn dies fehlschlägt, haben Sie keine andere Möglichkeit, als eine neue Datei zu erstellen und den Inhalt über sendfile zu kopieren (die Fehlerüberprüfung wurde weggelassen, siehe Manpages jeder Funktion für mögliche Fehlerwerte):

%Vor%     
pqnet 06.08.2014, 07:25
quelle
2

Frage: Ein hypothetischer Systemaufruf frename , der einen Dateideskriptor verwendet, existiert. Wenn eine Datei mehrere Namen hat (feste Links), wird dieser Name verschoben / umbenannt, wenn dieser Systemaufruf für einen Dateideskriptor verwendet wird das bezieht sich auf diese Datei?

Es gibt keine gute Antwort auf diese Frage, und das ist einer der Gründe, warum dieser Systemaufruf nicht existiert.

rename behandelt Verzeichniseinträge, die Zeiger auf Dateien (Inodes) sind. Ein geöffneter Dateideskriptor ist keinem bestimmten Verzeichniseintrag zugeordnet, sondern nur mit der Datei selbst (dem Inode). Aus dieser Perspektive macht der Systemaufruf, nach dem Sie fragen, keinen Sinn. Es gibt keine portable Möglichkeit, einem Inode zurück zu dem Verzeichniseintrag zu folgen, der auf ihn zeigt (und wiederum kann es mehr als einen von ihnen geben). Einige Betriebssysteme können verschiedene nicht tragbare Mittel zum Auffinden dieser Rückwärtsverbindung bereitstellen, die garantiert oder nicht immer mit einem Ergebnis (normalerweise nicht garantiert) aufwarten können, aber diese Mittel beantworten nicht die Frage, welcher Verzeichniseintrag zurückgegeben werden soll wenn es mehr als eins gibt und meines Wissens keiner von ihnen zu einem Systemaufruf wie dem, wonach Sie suchen, erweitert wurde.

    
Celada 13.12.2012 22:16
quelle

Tags und Links