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.
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 ( Ссылка )
Vorbehalte:
_GNU_SOURCE
definieren, um die Definition für AT_EMPTY_PATH
, 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):
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.