Linux Dateizugriff nach Dateierstellung mit open()



  • Hallo!
    Ich habe ein Programm geschrieben, dass mir eine Datei beim Aufruf erstelle und etwas hineinschreibt.
    Die Datei wird auch angelegt, aber ich kann sie nicht öffnen.
    Linux zeigt als Symbol ein Schloss vor der Datei und sagt mir beim Versuch, sie zu öffnen, ich habe keine Zugsngsberechtigung.

    Ich habe schon alle möglichen Modi bei der open() - Funktion versucht.
    O_RDWR funktioniert nicht.

    Das komische: Manchmal (hört sich lustig an aber es ist in der Tat nur manchmal so, wenn Linux Lust hat), dann lässt sie sich öffnen und es steht auch der reingeschriebene Text in der Datei.
    Klappte bisher komischerweise immer nur wenn ich als Modus O_WRONLY benutzt habe.
    Aber eben nur manchmal.

    Klingt komisch, ist aber so 😉

    Könnt ihr mir weiterhelfen? Wie kommt es, dass es manchmal funktioniert, und manchmal nicht, obwohl ich am Code nichts verändere?

    Hier mein Code:

    # include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    
    	int fh;
    	char puffer[27];
    	strcpy(puffer,"abcdefghijklmnopqrstuvwxyz");
    	if (argv[1] == NULL)
    	{printf("Kein Argument uebergeben.\n");
    	printf("Geben Sie bitte den Namen der Zieldatei an.\n");}
    	else
    	fh =  open(argv[1],O_RDWR|O_CREAT);
    	write(fh, &puffer);
    
    	return 0;
    }
    

    VIELEN DANK 🙂



  • //EDIT
    Ich seh grad du setzt ja garkeine Berechtigungen
    für die Datei?
    Das solltest du natürlich schon machen.

    fh =  open(argv[1],O_RDWR|O_CREAT, S_IRWXU);
    

    Vll. solltest du dir auch überlegen statt open
    fopen() zu verwenden. Das ist wesentlich einfacher
    zu bedienen.



  • hdi schrieb:

    Linux zeigt als Symbol ein Schloss vor der Datei und sagt mir beim Versuch, sie zu öffnen, ich habe keine Zugsngsberechtigung.

    <pedantic on>
    😕 was soll denn das heißen? Was meinst du damit?
    </pedantic off>

    Wenn es keinen Grund gibt, warum du mit Dateideskriptoren jonglieren sollst, dann verwende die Standard I/O Funktionen wie fopen. btw: man: write(2) erwartet 3 Parameter!



  • hallo!

    vielen lieben Dank!

    edit:

    also jetzt geht es, allerdings bekomme ich eine Hinweis-Meldung beim Öffnen:

    Die Datei ist binär, das Speichern wird zu einer fehlerhaften Datei führen.
    Wobei ich jetzt nicht weiss, ob das normal ist oder ich noch etwas falsch gemacht habe! Danke auf jeden Fall schon mal.

    ps: ich will open() benutzen, nicht fopen(). Ist halt so 😉



  • Also zunächst einmal nimmt Dir fopen eine Menge Arbeit ab. Zum einfachen schreiben in eine Datei solltest Du es verwenden. Nun gut, ich nehme an Du willst einfach mal ausprobieren wie es mit open geht. Aber dann solltest Du auf jeden Fall die Antwort des Systemaufrufs "open" abfragen ob es geklappt hat oder nicht.

    if ( ( fh = open ("mydatei", O_CREATE | O_EXCL | O_WRONLY , S_IRUSR | S_IWUSR ) ) == -1 )
     {
           perror ("Fehler beim Erzeugen der Datei!\n");
           exit( errno );
     }
    

    UND auch daran denken die Datei nach Beendigung des Zugriffs zu schliessen

    close (fh);
    

    Was die default-Zugriffsrechte betrifft, was gibt der Befehl "umask" auf Deiner Shell aus?

    Gruss Christian


Anmelden zum Antworten