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.
Zur Vervollständigung:
der Aufruf von bzw.
ergibt sowas wie
bzw.
Wahrscheinlich ist es nur ein einfaches Anfängerproblem. Ich hoffe mir kann jemand helfen.
Vielen Dank!
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
fetchmail -c | grep email1@bla.kecks | cut -c 16-21
ergibt sowas wie
244 N
(244
Wahrscheinlich ist es nur ein einfaches Anfängerproblem. Ich hoffe mir kann jemand helfen.
Vielen Dank!
Please also mark the comments that contributed to the solution of the article
Content-Key: 149006
Url: https://administrator.de/contentid/149006
Printed on: April 29, 2024 at 09:04 o'clock
3 Comments
Latest comment