GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Öffnen Sie einen Dateideskriptor mit einem anderen Zugriff erneut?

Ja! Der Trick besteht darin, über /proc/self/fd/n auf die gelöschte Datei zuzugreifen . Soweit ich weiß, ist das ein reiner Linux-Trick.

Führen Sie dieses Programm aus:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    FILE* out_file;
    FILE* in_file;
    char* dev_fd_path;
    char buffer[128];

    /* Write “hi!” to test.txt */
    out_file = fopen("test.txt", "w");
    fputs("hi!\n", out_file);
    fflush(out_file);

    /* Delete the file */
    unlink("test.txt");

    /* Verify that the file is gone */
    system("ls test.txt");

    /* Reopen the filehandle in read-mode from /proc */
    asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file));
    in_file = fopen(dev_fd_path, "r");
    if (!in_file) {
        perror("in_file is NULL");
        exit(1);
    }
    printf("%s", fgets(buffer, sizeof(buffer), in_file));

    return 0;
}

Es schreibt etwas Text in eine Datei, löscht sie, lässt aber den Dateideskriptor geöffnet und öffnet sie dann über einen anderen Weg erneut. Dateien werden nicht wirklich gelöscht, bis der letzte Prozess, der den letzten Dateideskriptor enthält, ihn schließt, und bis dahin können Sie über /proc auf den Dateiinhalt zugreifen .

Danke an meinen alten Chef Anatoly, der mir diesen Trick beigebracht hat, als ich einige wichtige Dateien gelöscht habe, die glücklicherweise noch von einem anderen Prozess angehängt wurden!


Nein, mit dem fcntl-Aufruf können Sie die Lese-/Schreibbits für einen offenen Dateideskriptor nicht setzen, und die einzige Möglichkeit, einen neuen Dateideskriptor aus einem vorhandenen zu erhalten, besteht darin, die Duplikatfunktionalität zu verwenden. Die Aufrufe von dup/dup2/dup3 (und fcntl ) erlauben Ihnen nicht, den Dateizugriffsmodus zu ändern.

HINWEIS:Dies gilt für Linux, aber nicht für andere Unixe im Allgemeinen. In HP-UX beispielsweise [siehe (1) und (2)] können Sie die Lese-/Schreibbits mit fcntl ändern Verwenden von F_SETFL für einen offenen Dateideskriptor. Da Dateideskriptoren von dup erstellt wurden teilen dieselben Status-Flags, jedoch ändert sich der Zugriffsmodus für den einen zwangsläufig auch für den anderen.


Linux
  1. Überwachung des Linux-Dateizugriffs?

  2. Ersetzen Sie Linien, die einem Muster entsprechen, durch Linien aus einer anderen Datei in der richtigen Reihenfolge?

  3. Newline durch Nul ersetzen?

  4. Dateiberechtigungen unter Linux mit Beispiel

  5. So prüfen Sie den Dateizugriff unter Linux

Linux-WC-Befehl mit Beispielen

Erste Schritte mit ls

Digitale Signaturen mit GnuPG

Portabilität von Dateideskriptor-Links?

Suchen von Inhalten einer Datei in einer anderen Datei

Ist mv mit Wildcard noch atomar