Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu C (Linux Programmierung) (https://www.delphipraxis.net/192681-frage-zu-c-linux-programmierung.html)

A.Griffin 10. Mai 2017 13:12

Frage zu C (Linux Programmierung)
 
Ich habe eine C Konsolenanwendung am laufen. Diese Anwendung hat auch eine Konsolen-GUI. Meine Frage: Ich habe in einem Fehlerfall bis jetzt die Fehler mit printf auf die Konsole geschrieben. Dies ist ist in diesem Fall sehr unschön, da die Konsolen-GUI ein Teil der Konsole ja bedeckt und man dadurch bei den Fehlern nicht gut durchblickt. Meine Idee wäre es jetzt die Fehler anstatt auf die Konsole in eine Textdatei zu schreiben. Am besten mit Zeitstempel. Weiß einer von euch wie ich das am besten machen könnte?

Vielen Dank im Voraus.

Klaus01 10. Mai 2017 13:22

AW: Frage zu C (Linux Programmierung)
 
..gib die Fehler doch auf STDERR.
STDERR kannst DU wenn das Programm gestartet wird umleiten (in ein File oder nach dev/null)

Grüße
Klaus

A.Griffin 10. Mai 2017 13:24

AW: Frage zu C (Linux Programmierung)
 
Gibt stderr auch den Zeitstempel an?

Klaus01 10. Mai 2017 13:37

AW: Frage zu C (Linux Programmierung)
 
Zitat:

Zitat von A.Griffin (Beitrag 1370905)
Gibt stderr auch den Zeitstempel an?

stderr gibt die selben Daten aus die du auch auf stdout sehen würdest.
Automatisch wird dort kein Zeitstempel hinzugefügt.

Grüße
Klaus

A.Griffin 10. Mai 2017 13:48

AW: Frage zu C (Linux Programmierung)
 
Ok danke. Ich habe jetzt eine Funktion gefunden, die einen Fehler in einer log Datei mit Zeitstempel schreibt.

himitsu 10. Mai 2017 14:39

AW: Frage zu C (Linux Programmierung)
 
Der Nächste freut sich bestimmt ganz doll, dass du deine Lösung nicht verraten hast, wenn er das selbe Problem hat und diesen Thread irgendwann findet.

PS: WriteLn hat auch einen Parameter für die Datei.
Also einmal mit
Delphi-Quellcode:
WriteLn(LogFile, DateTimeToStr(Now), Text);
oder
Delphi-Quellcode:
WriteLn(Text);
Oder alles mit "Datei", einmal AssignFile gegen eine Datei oder als Datei STDERR oder STDOUT verwenden.

A.Griffin 10. Mai 2017 14:50

AW: Frage zu C (Linux Programmierung)
 
Ich habe das genutzt:

Code:
void
ErrorAdd (const char *str, ...)
{
    FILE *fpError;

    va_list ap;
    char logBuf[256];
    static char oldLogBuf[256];

    archiveFile(LOG_PATH "/" ERROR_LOG_NAME);

    va_start (ap, str);
    vsprintf (logBuf, str, ap);
    va_end (ap);

    if (strcmp(oldLogBuf, logBuf))
    {
        fpError = fopen(LOG_PATH "/" ERROR_LOG_NAME, "ab");
        fprintf(fpError, "%s: %s\r\n", getTimestamp(), logBuf);
        fclose(fpError);
    }
    memcpy(oldLogBuf, logBuf, strlen(logBuf));
}
Ich habe aber jetzt das Problem, dass das nicht threadsicher zu sein scheint und die Software abstürzt, wenn ErrorAdd in einem zweiten Thread genutzt wird. Was kann ich da machen?

@himitsu: WriteLn ist Delphi (Pascal)

jobo 10. Mai 2017 15:43

AW: Frage zu C (Linux Programmierung)
 
Zitat:

Zitat von A.Griffin (Beitrag 1370916)

Ich habe aber jetzt das Problem, dass das nicht threadsicher zu sein scheint und die Software abstürzt, wenn ErrorAdd in einem zweiten Thread genutzt wird. Was kann ich da machen?

also STDERR und STDOUT, wie Klaus vorgeschlagen hat, ist m.E. best practice. So wird es in Linux gehandhabt. Du brauchst es nicht anders zu machen.
So kann der User (z.B. Du während der Entwicklung) entscheiden, wo der Kram hingeht, Dateiumleitung, STDOUT, dev/null, ..

Unter Windows soll es sowas ja auch geben...

A.Griffin 10. Mai 2017 15:49

AW: Frage zu C (Linux Programmierung)
 
Das würde dann so gehen:

Code:
fprintf( stderr, "Text" );
und dann in linux die software so starten:

Code:
programm 2> Datei.txt
Es würde dann nur noch der Zeitstempel fehlen.

hoika 10. Mai 2017 16:02

AW: Frage zu C (Linux Programmierung)
 
Hallo,

Zeitstempel steht weiter oben schon
Delphi-Quellcode:
fprintf(fpError, "%s: %s\r\n", getTimestamp(), logBuf);
oder halt gleich so
Delphi-Quellcode:
fprintf(stderr, "%s: %s\r\n", getTimestamp(), logBuf);


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz