Hallo zusammen,
zur Zeit arbeite ich an einem primitiven HTTP Server, für diesen wollte
ich Funktionen schreiben, welche Logdateien schreiben.
In der Funktion log_error_write() werden mehrere Zeichenketten mit Hilfe
von string_append() zusammen gesetzt. Da string_append() nur mit
übergebenen char * umgehen kann, werden vorher die Zeilennummer und der
Fehlercode mit snprintf() in eine Zeichenkette umgewandelt.
Nun ist das Problem, dass alles problemlos funktioniert, wenn ich nach
dem snprintf() einen printf() Aufruf durchführe. Dabei ist es auch egal
was printf() von sich gibt. Wenn ich printf() weglasse, beendet sich das
Programm mit einem Segmentation Fault.
Woher kommt dein "string_append"?
Das string_append, das ich auf die Schnelle gefunden habe, will als
ersten Parameter keinen Int, sondern einen char * auf einen Buffer, der
für den zusamengesetzten String verwendet wird.
Allerdings frage ich mich, wozu du dir die ganze Mühe machst, den String
erst mal mmühselig im Speicher zusammenzusetzen, anstelle von ganz
einfach mehreren Aufrufen von write.
Dann gäbs nänmlich auch kein Speicherleck. Du gibst den allokierten
Speicher nie wieder frei.
Was verbirgt sich hinter cnf->logfile_fd bzw. wie wird das File
geöffnet?
Edit: Offenbar ein File Handle. Gibt es irgendeinen Grund warum das kein
FILE* sein kann? Dann wäre deine Funktion
Karl heinz Buchegger schrieb:> anstelle von ganz> einfach mehreren Aufrufen von write.
Das kann daneben gehen, wenn der Server mit threads oder ge-fork()-ten
tasks arbeitet, die sich das Log-Filehandle teilen.
Damit sich die Ausgaben nicht innerhalb einer Zeile "vermischen", macht
es schon sinn, zuerst die Zeile im Ram vorzubereiten, und dann mit nur
einem write rauszuschreiben.
Ich würd das allerdings mit nur einem snprintf erschlagen. Kein
Speicherleck, und der Rückgabe-Wert geht gleich als Längenangabe fürs
Write, d.H. die ganzen O(n)-strlen-Aufrufe entfallen.
1
charbuffer[1024];
2
intlen=snprintf(buffer,sizeof(buffer),"Error [%d] on line %d in file %s ...\n",ierrno,iline,filename);
Karl heinz Buchegger schrieb:> Allerdings frage ich mich, wozu du dir die ganze Mühe machst, den String> erst mal mmühselig im Speicher zusammenzusetzen, anstelle von ganz> einfach mehreren Aufrufen von write.
->
Schorsch schrieb:> Das kann daneben gehen, wenn der Server mit threads oder ge-fork()-ten> tasks arbeitet, die sich das Log-Filehandle teilen.
Ja, danke Schorsch, so funktioniert es wunderbar. Ich frage mich gerade
warum ich es mir so kompliziert gemacht habe. Aber super, nun läuft es
ja problemlos, danke, hätte ich selbst drauf kommen sollen.
Aber merkwürdig fand ich das Problem schon.
Schönen Abend
James