GNU/Linux >> Znalost Linux >  >> Linux

Znovu otevřít deskriptor souboru s jiným přístupem?

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.


Linux
  1. Přenositelnost odkazů na deskriptor souboru?

  2. Nahradit řádky odpovídající vzoru řádky z jiného souboru v pořadí?

  3. Nahradit nový řádek nulou?

  1. Oprávnění souborů v Linuxu s příkladem

  2. Jak auditovat přístup k souborům v systému Linux

  3. Upozornění s nftw

  1. Hledání obsahu jednoho souboru v jiném souboru

  2. tar -C se vzorem souboru zástupných znaků

  3. Jak podložit soubor pomocí FF pomocí dd?