Sì! Il trucco è accedere al file eliminato tramite /proc/self/fd/n
. È un trucco solo per Linux, per quanto ne so.
Esegui questo programma:
#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;
}
Scrive del testo in un file, lo elimina, ma mantiene aperto il descrittore del file e quindi lo riapre tramite un percorso diverso. I file non vengono effettivamente eliminati fino a quando l'ultimo processo che contiene l'ultimo descrittore di file non lo chiude e, fino ad allora, puoi accedere al contenuto del file tramite /proc
.
Grazie al mio vecchio capo Anatoly per avermi insegnato questo trucco quando ho cancellato alcuni file importanti che fortunatamente venivano ancora aggiunti da un altro processo!
No, la chiamata fcntl non ti consente di impostare i bit di lettura/scrittura su un descrittore di file aperto e l'unico modo per ottenere un nuovo descrittore di file da uno esistente è utilizzare la funzionalità di duplicazione. Le chiamate a dup/dup2/dup3 (e fcntl
) non consentono di modificare la modalità di accesso ai file.
NOTA:questo è vero per Linux, ma non per altri Unix in generale. In HP-UX, ad esempio, [vedere (1) e (2)] è possibile modificare i bit di lettura/scrittura con fcntl
utilizzando F_SETFL su un descrittore di file aperto. Poiché i descrittori di file creati da dup
condividono gli stessi flag di stato, tuttavia, cambiando la modalità di accesso per uno, la cambierà necessariamente anche per l'altro.