PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Segmentation fault bei fclose()



Tos
05-10-1999, 21:48
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 );
}

Christoph
06-10-1999, 16:25
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

f0rtex
07-10-1999, 06:46
Was erzielst du damit wenn du den fp auf NULL setzt?
MfG
f0rtex

Christoph
07-10-1999, 09:15
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

Tos
08-10-1999, 00:10
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

wolfgang
08-10-1999, 14:31
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