Löcher in Dateien und O_APPEND



  • Hallo,

    ich bin eben auf etwas mir bis dato unbekanntes gestoßen:
    Wenn ich eine Datei mit O_APPEND öffne und dann mittels lseek mit der Option SEEK_END den Dateizeiger um offset bytes über das Dateiende hinaus verschieben will (Löcher machen) geht das nicht. Wiso nicht? Ist es nicht so dass O_APPEND nur den Dateizeiger auf das Ende der Datei setzt? Falls ja, wiso kann ich dieseb dann nicht über das Dateiende hinaus bewegen?

    für Eure Antworten wäre ich sehr dankbar

    Gruß 🙂



  • Laut meiner Manpage zu lseek wird das "Loch" erst produziert, wenn etwas an die neue Position geschrieben wurde, nicht unmittelbar nach dem Seek, oder was meinst Du mit "geht nicht"?



  • LordJaxom schrieb:

    Laut meiner Manpage zu lseek wird das "Loch" erst produziert, wenn etwas an die neue Position geschrieben wurde, nicht unmittelbar nach dem Seek, oder was meinst Du mit "geht nicht"?

    Ja, das habe ich berücksichtigt. Hier ein Testprogramm welches Löcher erstellt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #define HOLESIZE 100
    
    int
    main(int argc, char *argv[])
    {
            int             fd;
            char            i;
            mode_t          modus = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
            const char      buffer[BUFSIZ] = "abcdefghijklmnopqrstuvwxyz";
            const off_t     offset = HOLESIZE;
    
            if(argc != 2){
                    fprintf(stderr, "\nusage: %s <filename>\n", argv[0]);
                    exit(EXIT_FAILURE);
            }
    
            if((fd = open(argv[1], O_RDWR|O_CREAT, modus)) == -1){
                    perror("\nERROR open()");
                    exit(EXIT_FAILURE);
            }
    
            if(write(fd, buffer, strlen(buffer)) == -1){
                    perror("\nERROR write()");
                    exit(EXIT_FAILURE);
            }
    
            if(lseek(fd, offset, SEEK_END) == -1){
                    perror("\nERROR lseek()");
                    exit(EXIT_FAILURE);
            }
    
            if(write(fd, buffer, strlen(buffer)) == -1){
                    perror("\nERROR write()");
                    exit(EXIT_FAILURE);
            }
    
            close(fd);
    
            return(EXIT_SUCCESS);
    }
    

    Sofern man nun bei dem open() ein O_APPEND dazutut bildet das keine Löcher mehr.
    Woran kann das liegen?

    Gruß 🙂



  • [zuviel gepostet]



  • man: open: "Opening a file with O_APPEND set causes each write on the file to be appended to the end."

    Das passiert analog auch bei anderen File-Methoden (fopen() oder fstreams) - im Append-Modus werden die seek-Befehle ignoriert und ALLE Ausgaben landen direkt am Dateiende. Was spricht eigentlich dagegen, die Datei in O_RDWR-Modus zu öffnen?



  • Vielen Dank für die Antwort. Das war mir bis dahin nicht bekannt.

    CStoll schrieb:

    Was spricht eigentlich dagegen, die Datei in O_RDWR-Modus zu öffnen?

    Nichts, ich wollt das nur so ausprobieren.

    Danke && Gruß 🙂


Anmelden zum Antworten