O_APPEND funktioniert nicht



  • Hallo.
    Folgender Code geht:

    if((fd1 = open(argv[1], O_RDONLY)) == -1) 
      {
        fprintf(stderr, "Couldn't open file %s\n", argv[1]);
        exit(1);
      }
      if((fd2 = open(argv[2], O_WRONLY)) == -1) 
      {
        fprintf(stderr, "Couldn't open file %s\n", argv[2]);
        exit(1);
      }
      lseek(fd2, 0L, SEEK_END);
    
      while((wert=read(fd1, buffer, 1)) > 0)
      {
        if(write(fd2, buffer, wert) != wert)
        {   
          fprintf(stderr, "Error while writing\n");
          exit(1);
        }   
      }
    
      close(fd1);
      close(fd2);
    

    Wenn ich allerdings das O_WRONLY durch O_APPEND ersetze und fseek rausnehme, bricht das Programm beim Schreiben ab, fd2 ist leer.
    Eigentumsrechte sind wohl nicht das Problem.
    Was mache ich falsch?



  • 600apm schrieb:

    Hallo.
    Folgender Code geht:

    if((fd1 = open(argv[1], O_RDONLY)) == -1) 
      {
        fprintf(stderr, "Couldn't open file %s\n", argv[1]);
        exit(1);
      }
      if((fd2 = open(argv[2], O_WRONLY)) == -1) 
      {
        fprintf(stderr, "Couldn't open file %s\n", argv[2]);
        exit(1);
      }
      lseek(fd2, 0L, SEEK_END);
    
      while((wert=read(fd1, buffer, 1)) > 0)
      {
        if(write(fd2, buffer, wert) != wert)
        {   
          fprintf(stderr, "Error while writing\n");
          exit(1);
        }   
      }
    
      close(fd1);
      close(fd2);
    

    Wenn ich allerdings das O_WRONLY durch O_APPEND ersetze und fseek rausnehme, bricht das Programm beim Schreiben ab, fd2 ist leer.
    Eigentumsrechte sind wohl nicht das Problem.
    Was mache ich falsch?

    Es gibt da etwas das nennt sich errno und wird gesetzt, wenn ein Fehler auftritt. Mit strerror erhält man zu jedem Wert von errno eine textuelle Beschreibung des Problems.

    Ansonsten aus der Linux-Dokumentation:

    The argument flags must include one of the following access
    modes: O_RDONLY, O_WRONLY, or O_RDWR. These request opening
    the file read-only, write-only, or read/write, respectively.

    Aus der POSIX-Dokumentation:

    Values for oflag are constructed by a bitwise-inclusive OR
    of flags from the following list, defined in
    <fcntl.h>. Applications shall specify exactly one of the
    first three values (file access modes) below in the value of
    oflag:

    O_RDONLY
    Open for reading only.

    O_WRONLY
    Open for writing only.

    O_RDWR Open for reading and writing. The result is undefined
    if this flag is applied to a FIFO.



  • Danke. 👍


Log in to reply