Ano! Trik je v přístupu ke smazanému souboru přes /proc/self/fd/n
. Pokud vím, je to pouze linuxový trik.
Spusťte tento program:
#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;
}
Zapíše nějaký text do souboru, odstraní jej, ale ponechá deskriptor souboru otevřený a poté jej znovu otevře jinou cestou. Soubory se ve skutečnosti nesmažou, dokud jej nezavře poslední proces, který drží poslední deskriptor souboru, a do té doby se můžete k obsahu souboru dostat pomocí /proc
.
Děkuji svému starému šéfovi Anatolymu, že mě naučil tento trik, když jsem smazal některé důležité soubory, které byly naštěstí stále připojovány jiným procesem!
Ne, volání fcntl vám nedovolí nastavit bity čtení/zápisu na otevřeném deskriptoru souboru a jediný způsob, jak získat nový deskriptor souboru z existujícího, je použití duplicitní funkce. Volání dup/dup2/dup3 (a fcntl
) neumožňují změnit režim přístupu k souboru.
POZNÁMKA:Toto platí pro Linux, ale neplatí to pro ostatní Unixy obecně. Například v HP-UX [viz (1) a (2)] můžete změnit bity čtení/zápisu pomocí fcntl
pomocí F_SETFL na otevřeném deskriptoru souboru. Protože deskriptory souborů vytvořil dup
sdílejí stejné stavové příznaky, ale změna režimu přístupu pro jednoho ho nutně změní i pro druhého.