GNU/Linux >> Linux Esercitazione >  >> Linux

Riaprire un descrittore di file con un altro accesso?

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.


Linux
  1. Portabilità dei collegamenti del descrittore di file?

  2. Sostituire le righe che corrispondono a un motivo con le righe di un altro file in ordine?

  3. Sostituire Newline con Nul?

  4. Mantenimento delle autorizzazioni sui file con Git

  5. Trovare il contenuto di un file in un altro file

Comando Linux WC con esempi

Firme digitali con GnuPG

Accedi al thread locale da un altro thread

accesso simultaneo al file linux

sostituire le righe in un file con le righe in un altro per numero di riga

È mv con carattere jolly ancora atomico