Hallo,
ich habe einen Server geschrieben der selber eine Datei zum loggen öffnet und im moment nach jedem logeintrag wieder schließt. (Ohne das schließen passiert das selbe) Wenn ein Client sich mit dem Server verbindet wird ein Kindprozess erstellt.
Dieser soll nun ebenfalls diese Datei öffnen und sie schließen. Jedoch lößt das fopen des Kindprozesses ein Segmentation fault aus. Ich bin im Moment ratlos warum es im Elternprozess funktioniert und beim Kind nicht.
Hier der Code: writelog() schreibt den übergebenen String in die einzelnen Logfiles. initlog() öffnet die Datei, und lößt im Kindprozess das Signal aus. Die FILE Strukte sind als globale Variablen definiert.
Gruß
Lemiras
init_logging()
Funktion writelog()
ich habe einen Server geschrieben der selber eine Datei zum loggen öffnet und im moment nach jedem logeintrag wieder schließt. (Ohne das schließen passiert das selbe) Wenn ein Client sich mit dem Server verbindet wird ein Kindprozess erstellt.
Dieser soll nun ebenfalls diese Datei öffnen und sie schließen. Jedoch lößt das fopen des Kindprozesses ein Segmentation fault aus. Ich bin im Moment ratlos warum es im Elternprozess funktioniert und beim Kind nicht.
Hier der Code: writelog() schreibt den übergebenen String in die einzelnen Logfiles. initlog() öffnet die Datei, und lößt im Kindprozess das Signal aus. Die FILE Strukte sind als globale Variablen definiert.
Gruß
Lemiras
init_logging()
Code:
static void init_logging(bool first_use){
static char *tmp_debugfile;
static char *tmp_errfile;
static char *tmp_msgfile;
if(seconf->debug ){
if(first_use){
if((tmp_debugfile = malloc(strlen(LOG_PATH)+strlen("_debug")+strlen(seconf->logfile)+1)) == NULL){
fprintf(stderr,MSG_ALLOC_FAIL);
exit(EXIT_FAILURE);
}
sprintf(tmp_debugfile,"%s%s%s",LOG_PATH,seconf->logfile,"_debug");
}
/*Hier tritt der Fehler auf*/
if((debugfile = fopen(tmp_debugfile,"a")) == NULL){
fprintf(stderr, MSG_CANT_OPEN, tmp_debugfile);
free(tmp_debugfile);
exit(EXIT_FAILURE);
}
// free(tmp_debugfile);
}
if(first_use){
if((tmp_errfile = malloc(strlen(LOG_PATH)+strlen("_err")+strlen(seconf->logfile)+1)) == NULL){
fprintf(stderr,MSG_ALLOC_FAIL);
exit(EXIT_FAILURE);
}
sprintf(tmp_errfile,"%s%s%s",LOG_PATH,seconf->logfile,"_err");
}
if((errfile = fopen(tmp_errfile,"a")) == NULL){
fprintf(stderr, MSG_CANT_OPEN, tmp_errfile);
free(tmp_errfile);
exit(EXIT_FAILURE);
}
// free(tmp_errfile);
if(first_use){
if((tmp_msgfile = malloc(strlen(LOG_PATH)+strlen("_msg")+strlen(seconf->logfile)+1)) == NULL){
fprintf(stderr,MSG_ALLOC_FAIL);
exit(EXIT_FAILURE);
}
sprintf(tmp_msgfile,"%s%s%s",LOG_PATH,seconf->logfile,"_msg");
}
if((msgfile = fopen(tmp_msgfile,"a")) == NULL){
fprintf(stderr, MSG_CANT_OPEN, tmp_msgfile);
free(tmp_msgfile);
exit(EXIT_FAILURE);
}
free(tmp_msgfile);
}
Funktion writelog()
Code:
void writelog(short prio, char *name, char *format, ...){
static bool first_start = false;
va_list arglist;
char *formatstr;
char *tmptime;
time_t ltime;
char *X;
if(prio == LOGDEBUG && seconf->debug == false){
return;
}
if(!first_start){
first_start = true;
// init_logging();
}
debugfile = NULL;
msgfile = NULL;
errfile = NULL;
init_logging(first_start);
if((formatstr = malloc(sizeof(char) * (strlen(name)+ 100 + strlen(format)))) == NULL){
exit(EXIT_FAILURE);
}
//Datum des Logeintrags
ltime = time(NULL);
tmptime =ctime(<ime);
tmptime[24] = '\0';
sprintf(formatstr, "%s; %d; %s:\t %s",tmptime,getpid(),name,format);
va_start(arglist, format);
semOp(SEM_LOCK,SEM_LOG);
if((prio <= LOGDEBUG) && seconf->debug){
if(vfprintf(debugfile, formatstr, arglist) < 0){
X = strerror(errno);
}
}
if((prio <= LOGMSG)){
if(vfprintf(msgfile, formatstr, arglist) < 0){
X = strerror(errno);
}
}
if((prio <= LOGERR)){
if(vfprintf(errfile, formatstr, arglist) < 0){
X = strerror(errno);
}
}
if(debugfile != NULL){
fclose(debugfile);
}
if(errfile){
fclose(errfile);
}
if(msgfile != NULL){
fclose(msgfile);
}
// fflush(NULL);
semOp(SEM_UNLOCK,SEM_LOG);
va_end(arglist);
free(formatstr);
}
Zuletzt bearbeitet: