layeracht
Goto Top

Segmentation fault nach längerer Laufzeit

Hallo an alle Wissenden!

Ich habe ein Problem mit meinem C-Code auf Linux.
Nach einer längeren Laufzeit meines Programms stürzt dieses immer mit einem "segmentation fault" ab. Mittlerweile habe ich auch herausgefunden wo und wann dies passiert. Jedoch kann ich das Problem dennoch nicht lösen.

Die Aufgabe des Programms ist einfach:
Überprüfe alle 60 sek. ob auf einem der 3 E-Mailpostfächer eine E-Mail auf mich wartet.

Um herauszufinden wo das Problem liegt, habe ich ein einfaches printf verwendet (Siehe Code). Damit konnte ich sehen an welcher Stelle das Programm ein "segmentation fault" bekommt. (Wahrscheinlich gibt es einen leichteren und besseren Weg, aber warum einfach wenn es auch schwer geht...)
Somit konnte ich jedenfalls herausfinden, dass das Programm beim 204 ausführen der for-schleife beim letzten sscanf hängen bleibt.

#include <stdio.h>
#include <string.h>

char new_mail[1024];
char mailbuffer[11];
int mailbuffer_gesamt;
int mailbuffer_gelesen;
int mail_ungelesen_a_1;
int mail_ungelesen_a_2;
int mail_ungelesen_a_3;
int mail_ungelesen;
FILE *mail;
int r=0;
int n;

int main (void)
{
printf("Programm wird gestartet...\n");  
for ( ; ; ) {
r++;
mail = popen("fetchmail -c | grep email1@bla.kecks | cut -c 16-21", "r");  
while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
	printf("size_t size = strlen(mailbuffer)\n");  
	size_t size = strlen(mailbuffer);
	printf("size_t i = 0\n");  
	size_t i = 0;
	for ( ; i < size; ++i) {
		printf("if (mailbuffer[i] == '(') mailbuffer[i] = ' '\n");  
		if (mailbuffer[i] == '(') mailbuffer[i] = ' ';  
	}
	printf("sscanf (mailbuffer, d ,&mailbuffer_gelesen)\n");  
	n=1;
	printf("Runde: %i E-Mail: %i\n", r, n);  
	sscanf (mailbuffer,"%d",&mailbuffer_gelesen);  
}

mail = popen("fetchmail -c | grep email1@bla.kecks | cut -c 1-5", "r");  
	while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
		printf("sscanf (mailbuffer, d ,&mailbuffer_gesamt)\n");  
		sscanf (mailbuffer,"%d",&mailbuffer_gesamt);  
	}
printf("%i, %i\n", mailbuffer_gesamt, mailbuffer_gelesen);  
mail_ungelesen_a_1 = mailbuffer_gesamt - mailbuffer_gelesen;

mail = popen("fetchmail -c | grep email2@bla.kecks | cut -c 16-21", "r");  
while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
	printf("size_t size = strlen(mailbuffer)\n");  
	size_t size = strlen(mailbuffer);
	printf("size_t i = 0\n");  
	size_t i = 0;
	for ( ; i < size; ++i) {
		printf("if (mailbuffer[i] == '(') mailbuffer[i] = ' '\n");  
		if (mailbuffer[i] == '(') mailbuffer[i] = ' ';  
	}
	printf("sscanf (mailbuffer, d ,&mailbuffer_gesamt);\n");  
	n=2;
	printf("Runde: %i E-Mail: %i\n", r, n);  
	sscanf (mailbuffer,"%d",&mailbuffer_gelesen);  
}

mail = popen("fetchmail -c | grep email2@bla.kecks | cut -c 1-5", "r");  
while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
	printf("sscanf (mailbuffer, d ,&mailbuffer_gesamt)\n");  
	sscanf (mailbuffer,"%d",&mailbuffer_gesamt);  
}
printf("%i, %i\n", mailbuffer_gesamt, mailbuffer_gelesen);  
mail_ungelesen_a_2 = mailbuffer_gesamt - mailbuffer_gelesen;

mail = popen("fetchmail -c | grep email3@bla.kecks | cut -c 16-21", "r");  
while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
	printf("size_t size = strlen(mailbuffer)\n");  
	size_t size = strlen(mailbuffer);
	printf("size_t i = 0\n");  
	size_t i = 0;
	for ( ; i < size; ++i) {
		printf("if (mailbuffer[i] == '(') mailbuffer[i] = ' '\n");  
		if (mailbuffer[i] == '(') mailbuffer[i] = ' ';  
	}
	printf("sscanf (mailbuffer, d ,&mailbuffer_gesamt)\n");  
	n=3;
	printf("Runde: %i E-Mail: %i\n", r, n);  
	sscanf (mailbuffer,"%d",&mailbuffer_gelesen);  
}

mail = popen("fetchmail -c | grep email3@bla.kecks | cut -c 1-5", "r");  
while (fgets(mailbuffer, sizeof(mailbuffer)-1, mail) != NULL) {
	printf("sscanf (mailbuffer, d ,&mailbuffer_gesamt)\n");  
	sscanf (mailbuffer,"%d",&mailbuffer_gesamt);  
}

printf("pclose(mail)\n");  
pclose(mail);
printf("%i, %i\n", mailbuffer_gesamt, mailbuffer_gelesen);  
mail_ungelesen_a_3 = mailbuffer_gesamt - mailbuffer_gelesen;
mail_ungelesen = mail_ungelesen_a_1 + mail_ungelesen_a_2 + mail_ungelesen_a_3;
printf("%i + %i + %i = %i\n", mail_ungelesen_a_1, mail_ungelesen_a_2, mail_ungelesen_a_3, mail_ungelesen);  

printf("Anzeige der ungelesenen Nachrichten\n");  
if (mail_ungelesen > 1) {
	snprintf(new_mail, sizeof(new_mail), "Sie haben %i neue Nachrichten", mail_ungelesen);  
	[...]
} else if (mail_ungelesen == 1) {
	snprintf(new_mail, sizeof(new_mail), "Sie haben %i neue Nachricht  ", mail_ungelesen);  
	[...]
} else {
	printf("Keine Nachrichten...\n");  
	[...]
}
printf("60 sek. warten...\n");  
sleep(60);
printf("auf neue E-Mails ueberpruefen...\n");  
}
}

Zur Vervollständigung:
der Aufruf von
fetchmail -c | grep email1@bla.kecks | cut -c 1-5
bzw.
fetchmail -c | grep email1@bla.kecks | cut -c 16-21

ergibt sowas wie
244 N
bzw.
 (244 

Wahrscheinlich ist es nur ein einfaches Anfängerproblem. Ich hoffe mir kann jemand helfen.

Vielen Dank!

Content-Key: 149006

Url: https://administrator.de/contentid/149006

Printed on: April 29, 2024 at 09:04 o'clock

Member: dog
dog Aug 14, 2010 at 18:09:10 (UTC)
Goto Top
Du öffnest pro Durchlauf 6 FILE-Streams aber schließt nur einen...

Und für den Rest gibt es gdb
Member: LayerAcht
LayerAcht Aug 14, 2010 at 18:36:31 (UTC)
Goto Top
achso, ich dachte ich schließe damit alle, da diese ja gleich heißen. Ich versuch es mal.
Danke
Member: LayerAcht
LayerAcht Aug 14, 2010 at 19:45:33 (UTC)
Goto Top
Super. Es hat funktioniert. Manchmal sind es halt die einfachen Dinge im Leben.
Vielen Dank!