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.