[C] SEGMENTATION FAULT bei fclose

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Wraith
Beiträge: 40
Registriert: 20.05.2006 20:18:23

[C] SEGMENTATION FAULT bei fclose

Beitrag von Wraith » 28.04.2014 00:02:01

Hi,

ok, anscheinend sind deutsche Buecher nicht so ausfuehrlich.
Wie auch immer, ich beziehe mich hier auf die Programmiersprache C und brauche im Grunde nur ein einfaches "Ja" oder "Nein". Kurz um:

Mein Verstaendnis nach:
Oeffne ich ein File - besser gesagt einen Stream - mit "fopen", wird es automatisch beim Beenden des Programmes geschlossen - aber (eigentlich) oeffne ich eine "Adresse" (grob gesagt).

Code: Alles auswählen

FILE *xyz;
fopen(xyz, ...);
Das File bzw., die Adresse wird automatisch beim Beenden des Programmes wieder geschlossen, aber gewissenhaft, wie man ist, schliesse ich das/die File/Adresse noch waehrend der Laufzeit

Code: Alles auswählen

fclose (xyz);
Kann das File nicht geoeffnet werden, erhaelt die Adresse keinen Wert - also NULL - und ein manuelles Schliessen macht aufgrund der fehlenden "Adresse" keinen Sinn und wird mit einem SEGMENTATION FAULT quittiert (Zumindest habe ich den Effekt, wenn ich "fclose" entsprechend verschiebe)?

Kann man das so (grob) festhalten?

gtz
- Wraith

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [C] SEGMENTATION FAULT bei fclose

Beitrag von Cae » 28.04.2014 00:15:04

Aus fclose(3):

Code: Alles auswählen

       The  behaviour  of  fclose() is undefined if the stream parameter is an
       illegal pointer
Also ja, es kann (und sollte, weil Programmierfehler) segfaulten.

Auf die Idee, das fopen() entsprechend abzufangen, z.B. per

Code: Alles auswählen

#include <stdio.h>
#include <errno.h>

int main(void) {
	FILE *f = NULL;

	if (NULL == (f = fopen("/path", "r"))) {
		perror("fopen()");
		return 1;
	}

	fclose(f);

	return 0;
}
bist du sicher auch schon gekommen.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Wraith
Beiträge: 40
Registriert: 20.05.2006 20:18:23

Re: [C] SEGMENTATION FAULT bei fclose

Beitrag von Wraith » 28.04.2014 00:28:10

Cae hat geschrieben:Auf die Idee, das fopen() entsprechend abzufangen, z.B. per

Code: Alles auswählen

#include <stdio.h>
#include <errno.h>

int main(void) {
	FILE *f = NULL;

	if (NULL == (f = fopen("/path", "r"))) {
		perror("fopen()");
		return 1;
	}

	fclose(f);

	return 0;
}
bist du sicher auch schon gekommen.
Aber selbstverstaendlich.:wink:
Nur ist mit Option a die fehlende Datei ein Fehler, mit Option b nicht und mit Option c nur dann, wenn Option d existiert.

Aber zum obigen Beispiel: Ich hatte in der if-Anweisung eben auch ein "fclose" stehen.

Danke.

gtz
- Wraith

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [C] SEGMENTATION FAULT bei fclose

Beitrag von wanne » 28.04.2014 06:30:50

Aber zum obigen Beispiel: Ich hatte in der if-Anweisung eben auch ein "fclose" stehen.
Das solltest du aber nicht machen. Es kann einen segfault geben muss aber nicht.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: [C] SEGMENTATION FAULT bei fclose

Beitrag von peschmae » 28.04.2014 08:15:11

Segfault heisst im Normalfall, dass er irgendwie wild im Speicher rumstochert wo er nicht dürfte, und dass der Kernel (bzw. die mmu) das bemerkt hat. Nicht was du haben möchtest und zu keinem Zeitpunkt akzeptables Verhalten.

Und, wie wanne schon sagt, auch wenn es keinen gäbe, würde das nicht heissen dass das so sauber ist. Heisst nur dass der Code per Zufall in Speicher rumstochert der zum Prozess gehört ;)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Antworten