Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Segmentation fault bei fclose()

  1. #1
    Tos
    Gast

    Question Segmentation fault bei fclose()

    Hallo!

    Ich habe festgestellt, wenn man auf einen bereits geschlossenen File Pointer noch mal
    ein fclose() macht, stuertzt das Programm mit
    einem Segmentation fault ab.

    Das heisst nicht dass ich ein fclose() auf eine bereits geschlossene Datei machen will,
    aber leider gibt es einige alte Programme die das machen und für die die Sourcen nicht mehr vorhanden sind.

    Ich glaube der Fehler liegt in der libc/glibc
    Bibliothek.

    Ich habe es unter den folgenden Versionen, mit der dazugehoerenden libc/glibc Bibliothek, getestet:

    SuSE 5.2 Kernel 2.0.31: kein Absturz
    SuSE 6.1 Kernel 2.0.36: Segmentation fault
    SuSE 6.1 Kernel 2.2.5 : Segmentation fault
    SuSE 6.2 Kernel 2.2.10: Segmentation fault

    Kann mir jemand sagen, ob das Problem schon bekannt ist und wie man den Fehler im Linux beheben kann.

    Auf vielen anderen Betriebssystemen wie SCO Unix, Solaris, AIX und NCR Unix stuerzt
    fclose() nicht ab, sondern gibt EBADF als Fehlerwert zurueck.

    Gruß

    Thomas


    Testbeispielprogramm:
    ---------------------
    #include

    int
    main( argc, argv )
    int argc;
    char *argv[];
    {
    FILE *tos;

    if( (tos = fopen( "thomas", "r" )) == NULL )
    {
    perror( "thomas" );
    exit( 1 );
    }

    fprintf( stderr, "Vor 1\n" ); fflush( stderr );
    fclose( tos );
    sleep( 3 );
    fprintf( stderr, "Vor 2\n" ); fflush( stderr );
    fclose( tos );
    sleep( 3 );
    fprintf( stderr, "Vor 3\n" ); fflush( stderr );
    fclose( tos );
    sleep( 3 );
    fprintf( stderr, "Vor 4\n" ); fflush( stderr );
    fclose( tos );
    sleep( 3 );
    fprintf( stderr, "Vor 5\n" ); fflush( stderr );
    fclose( tos );
    exit( 0 );
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    22.06.1999
    Beiträge
    677

    Post

    Komisch, meine Antwort zu diesem Thema ist wieder verschwunden. Deshalb nochmal:

    Einen Nirwana-Pointer FILE* fp mit fclose(fp) zu schliessen sollte schiefgehen.

    Wenn du unbedingt geschlossene Files nochmal schliessen willst (wieso?), dann mache setze den Pointer nach dem Schliessen einfach auf NULL:

    fclose(fp); fp=NULL;
    fclose(fp); fp=NULL;
    usw.

    Christoph

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.07.1999
    Ort
    Zürich
    Beiträge
    221

    Post

    Was erzielst du damit wenn du den fp auf NULL setzt?
    MfG
    f0rtex

  4. #4
    Registrierter Benutzer
    Registriert seit
    22.06.1999
    Beiträge
    677

    Post

    Zweierlei:

    1) Es lässt sich leicht überprüfen, ob das File geschossen ist (falls man das aus irgendeinem Grund nicht weiss): if (!fp) {}

    2) fclose(NULL) macht gar nichts, was ja der Wunsch des ursprünglichen Fragers war.

    Wenn man natürlich aufgrund seines Programmablaufs weiss, wann ein File geöffnet und wann geschlossen werden muss, ist das nicht nötig. Wenn man dagegen üppig Sprunganweisungen verwendet (return, break, exceptions (das sind Sprünge mit weitgehend unbekanntem Zielort!)), dann kann das nützlich sein.

    Christoph

  5. #5
    Tos
    Gast

    Unhappy

    Vielen Dank für die Antworten, aber leider gehen sie am Problem vorbei.

    Wie ich im meiner Frage schon schrieb, habe ich keinen Einfluß darauf ob der fclose()
    auf eine bereits geschlossene Datei gemacht wird, da es sich um ein fertig kompiliertes
    Programm handelt, zu dem keine Sourcen mehr vorhanden sind!

    Ich brauche eine Lösung oder einen Hinweis wie man den Fehler in fclose()/glibc beheben kann.

    Gruß

    Thomas

  6. #6
    wolfgang
    Gast

    Wink

    ich hatte aehnliche probleme und hatte dann festgestellt dass ich irgendwo in meinem source falsche zeiger ( fp ) deklariert hatte. wenn ich was mit open() {ohne f} oeffne und mit fclose() {mit f} schliesse
    dann habe ich immer auch den segmentation fehler. wenn ich dann close() anstelle fclose() nehme funktioniert es!
    ich weiss dass die antwort nicht von einem profi ist sonder von mir aber vieleicht hilts ja trotzdem, wuerde mich freuen!

    ------------------
    BCD
    Wolfgang Beppler
    Auenstr. 17
    88356 Ostrach-Waldbeuren
    e-mail: beppler.connect@t-online.de
    http://www.info-bodensee.com/bcd
    Tel +49 7585 935 791
    Fax +49 7585 935 799

Lesezeichen

Berechtigungen

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