GNU/Linux >> Tutoriales Linux >  >> Linux

¿Reabrir un descriptor de archivo con otro acceso?

¡Sí! El truco es acceder al archivo eliminado a través de /proc/self/fd/n . Es un truco exclusivo de Linux, que yo sepa.

Ejecute este programa:

#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;
}

Escribe algo de texto en un archivo, lo elimina, pero mantiene abierto el descriptor del archivo y luego lo vuelve a abrir a través de una ruta diferente. Los archivos no se eliminan realmente hasta que el último proceso que contiene el último descriptor de archivo lo cierra y, hasta entonces, puede acceder al contenido del archivo a través de /proc .

¡Gracias a mi antiguo jefe Anatoly por enseñarme este truco cuando eliminé algunos archivos importantes que, afortunadamente, todavía estaban siendo agregados por otro proceso!


No, la llamada fcntl no le permitirá configurar los bits de lectura/escritura en un descriptor de archivo abierto y la única forma de obtener un nuevo descriptor de archivo de uno existente es usando la función de duplicado. Las llamadas a dup/dup2/dup3 (y fcntl ) no le permiten cambiar el modo de acceso al archivo.

NOTA:esto es cierto para Linux, pero no para otros Unixes en general. En HP-UX, por ejemplo, [consulte (1) y (2)] puede cambiar los bits de lectura/escritura con fcntl usando F_SETFL en un descriptor de archivo abierto. Dado que los descriptores de archivos creados por dup comparten las mismas banderas de estado, sin embargo, cambiar el modo de acceso para uno necesariamente lo cambiará para el otro.


Linux
  1. ¿Portabilidad de los enlaces de descriptores de archivos?

  2. ¿Reemplazar líneas que coinciden con un patrón con líneas de otro archivo en orden?

  3. ¿Reemplazar nueva línea con Nul?

  4. Permisos de archivo en Linux con ejemplo

  5. Cómo auditar el acceso a archivos en Linux

Comando WC de Linux con ejemplos

Comenzando con ls

Firmas digitales con GnuPG

tar -C con un patrón de archivo comodín

¿Cómo rellenar un archivo con FF usando dd?

¿mv con comodín sigue siendo atómico?