David: Unix-Systemcalls -> Datei kopieren

Moin Moin,

ich weiß nicht so recht ob das Thema hier reinpasst, bin verzweifelt auf der Suche nach einen erfahrenen Unix / C Programmierer.

ich möchte ein kleines Programm unter Unix schreiben, welches mir eine Datei kopiert. Mein Problem liegt teilweise im Verständnis der Parameterversorgung der Funktionen read(), creat(), write(). Allein mit der Manpage komme ich nur wenig zurecht. Im Internet fand ich leider auch so gut wie keine Erläuterungen oder Beispielprogramme. Vielleicht habe ich auch schlecht gesucht!?

Was ich auch nicht verstanden habe ist, Funktion read():
Der genaue Unterschied zwischen Buffer und size!?
Der Buffer wird doch verwendet um eine bestimmte Anzahl Bytes in den Arbeitsspeicher zu laden, wozu braucht man dann size?

Würde mich freuen wenn sich ein erfahrener Programmierer mal mein bisheriges Programm anschauen könnte, und mir evtl. zeigen könnte was ich vergessen bzw. falsch gemacht habe. Danke schon mal.

  
#include <stdio.h>  
#include <sys/types.h>    //open(), creat()  
#include <sys/stat.h>    //open(), creat()  
#include <fcntl.h>    //open(), creat()  
#include <unistd.h>     //read(), write()  
  
int main()  
{  
    const char *quell_datei = "quelle.txt";  
    const char *ziel_datei = "ziel.txt";  
    char buffer[4096];  
    int size = 4069;  
    int in, out, length;  
  
    if ( (in = open(quell_datei, O_RDONLY)) == -1 )    // Quelldatei öffnen  
        printf("Datei nicht vorhanden");  
    else {  
        length = read(in, buffer, size); // Quelldatei lesen  
        printf("Groesse der eingelesenen Datei: %i",length);  
  
        out = creat(ziel_datei, O_WRONLY); //Zieldatei erzeugen  
  
        write(out, buffer, length);  
    }  
  
    close(in);  
    close(out);  
  
return 0;  
}  

Das Programm ist nicht vollständig, hier wird max. 4096byte kopiert. Das soll auch vorerst mal so bleiben. Mein Ziel ist es, einfach nur mal eine Datei zu kopieren. Achso, die Zieldatei wird zwar erzeugt, kann sie aber über den Windows-Explorer nicht öffnen: "Zugriff verweigert". In der Manpage zu creat() steht:

Die Definition wird, wie üblich, durch die Umgebungsvariable umask übernommen. Die Zugriffsrechte der angelegten Datei werden durch (mode & ~umask) festgelegt.

Auch noch so en Ding, keine Ahnung wie ich in creat() die Zugriffsrechte richtig definiere!? Danke schon mal für die Hilfe.

Gruß
David

  1. Moin,

    Was ich auch nicht verstanden habe ist, Funktion read():
    Der genaue Unterschied zwischen Buffer und size!?
    Der Buffer wird doch verwendet um eine bestimmte Anzahl Bytes in den Arbeitsspeicher zu laden, wozu braucht man dann size?

    Na der Buffer sind die Bytes, also der Speicher, und size ist die Größe, also wieviel Speicher davon maximal verwendet werden dürfen. a) kann die Funktion ja nicht riechen wieviel Speicher du reserviert hast, da das in C nicht herauszukriegen ist, und b) kann sie ja selbst wenn sie das wüsste nicht notwendigerweise davon ausgehen dass du auch den ganzen bereitgestellten Speicher benutzen möchtest.

    out = creat(ziel_datei, O_WRONLY); //Zieldatei erzeugen

      
    Das ist so nicht richtig. create() nimmt als zweiten Parameter mode, die Konstante O\_WRONLY ist aber als Hilfe zum Angeben von flags für open() gedacht. Am einfachsten ist es, dort einfach 00777 zu übergeben (die führende Null ist wichtig!), was erstmal allen Rechten für alle entspricht. Wie du richtig gelesen hast werden die Rechte dann evt. noch durch die umask eingeschränkt. Realistischer ist ein Wert wie 00644 (Benutzer darf Lesen und Schreiben, alle anderen dürfen nur Lesen). Es gibt da zwar auch symbolische Konstanten für, aber das ist mir zu kompliziert. (S\_IRWXU|S\_IRWXG|S\_IRWXO für den ersten Fall und S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IROTH für den zweiten Fall.)  
      
    
    > Auch noch so en Ding, keine Ahnung wie ich in creat() die Zugriffsrechte richtig definiere!? Danke schon mal für die Hilfe.  
      
    Siehe oben. Das sind halt die ganz normalen Unix-Rechte, wie sie auch in der chmod-Manpage beschrieben sein sollten.  
      
    Ansonsten kann ich dir noch sehr das glibc-Manual an's Herz legen, das viele Sachen angenehm ausführlich beschreibt. <http://www.gnu.org/software/libc/manual/html_node/Opening-and-Closing-Files.html#index-creat-1195> (ist speziell für create)  
    
    -- 
    Henryk Plötz  
    Grüße aus Berlin  
    ~~~~~~~~ Un-CDs, nein danke! <http://www.heise.de/ct/cd-register/> ~~~~~~~~  
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~