Anzeige:
Ergebnis 1 bis 3 von 3

Thema: fgetpwent() wird mit Speicherverletzung quittiert?

  1. #1
    Gast

    Post fgetpwent() wird mit Speicherverletzung quittiert?

    Ich hab ein Programmm geschrieben was der Compiler ohne warnung und fehler durchlaufen läßt. Nun gibt es aber bei der Ausführung des Programms einer Speicherverletzung:
    "/tmp/xwpe_oN2TFm/we_sys_tmp: line 1: 3131 Speicherzugriffsfehler $*"
    und das Programm wird nicht ordentlich beendet. ich hab breits alles im Programm über Bord geworfen und dabei festgestellt das der Fehler in der fgetpwent() Funktion steckt! Fliegt diese raus ist alle OK.
    Nun hab ich mir angeschaut das in der C reference steht:
    " struct passwd *fgetpwent(FILE *stream)

    ...
    The file stream must have the same format as /etc/passwd"
    Was heißt das und könnte der Fehler hier liegen?
    Danke für die Hilfe!
    Tschau Robi!

  2. #2
    Gast

    Post

    Vielleicht sollt ich noch den Quellcode des Programms posten:
    "
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <pwd.h>
    #include <sys/types.h>

    int main(int argc, char *argv[])
    {
    char buf[100];
    FILE *pass;
    struct passwd *pass_1;
    pass=fopen(argv[1],"r");
    while(!feof(pass))
    {
    pass_1 =fgetpwent(pass); printf("%s\n",pass_1->pw_name);
    }
    fclose(pass);
    }"

    Und es liegt auch nicht direkt an der fgetpwent Funktion, sondern dem Arbeiten mit der von ihr übergebenen Funktion!

  3. #3
    Gast

    Post

    Code:
    #include <stdlib.h>
    #include &lt;stdio.h&gt;
    #include &lt;pwd.h&gt;
    #include &lt;sys/types.h&gt;
    
    int main(int argc, char *argv[]) 
    { 
      char buf[100]; 
      FILE *pass; 
      struct passwd *pass_1;
      pass = fopen(argv[1], "r"); 
      if (pass != NULL) {
        for ( pass_1 = fgetpwent(pass) ;
    	  pass_1 != NULL ;
    	  pass_1 = fgetpwent(pass) ) {
          printf("%s\n",pass_1-&gt;pw_name); 
        } 
        fclose(pass); 
      } else
        perror(argv[0]);
    }
    Merke:
    Du solltest _jeden_ Ruckgabewert einer Systemfunktion auf Fehler ueberpruefen.
    Ausserdem solltest Du den Wert selber testen (pass_1) und nicht irgenwelche Vermutungen uber irgenwelche Zusammenhange (!feof(pass))

    (!feof(pass)) Zeigt nach dem letzten user naemlich noch kein Dateiende an, da fgetwent ja nur bis einschliesslich des "\n" der jeweiligen Zeile liest und erst beim naechtsen Aufruf an das Dateiende stoesst und
    NULL zurueckliefert.
    Dereferenzierst Du nun den NULL-Pointer gibst halt nen Segfault.

    man fgetpwent
    beschreibt ja auch dieses Verhalten.

    if (pass != NULL) sollte auch _nie_ fehlen nach dem Versuch pass mit fopen zu oeffnen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •