C printf

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rbv
Beiträge: 20
Registriert: 08.03.2010 21:46:44

C printf

Beitrag von rbv » 08.03.2010 21:51:16

Hallo liebes Forum,
ich habe ein kleines Problem mit C:

Code: Alles auswählen

#include <stdio.h>
int main (void) {
        int temp;
        while (1) {
            temp = 3;
            printf ("%d \n", temp);
        }
    return;
}
Könnt ihr mir erklären, warum die Ausgabe erst dann auf dem Bildschirm erscheint, wenn ich das Programm mit STRG+C abgebrochen habe?

Danke
Zuletzt geändert von Meillo am 10.03.2010 10:11:41, insgesamt 1-mal geändert.
Grund: code-Tags ergänzt

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: C printf

Beitrag von gms » 08.03.2010 22:47:37

Willkommen im Forum!

weil die Ausgabe gebuffert wird ( siehe "man fflush" )

Gruß
gms

edit: changed flush->fflush

rbv
Beiträge: 20
Registriert: 08.03.2010 21:46:44

Re: C printf

Beitrag von rbv » 09.03.2010 00:33:04

Danke sehr, das hilft mir schonmal weiter.
Aber wie gehe ich da jetzt weiter vor? Nach jeder Zeile fflush() rufen doch sicher nicht, oder? Macht es Sinn dafür einen eigenen Thread anzulegen oder was wäre hier die Beste Lösung?

Mir ist aufgefallen, wenn ich ein usleep(2); nach dem printf benutze, habe ich das oben angesprochene Verhalten nicht. Ich interpretiere das so, dass durch das Sleep vor der Abgabe an andere Prozesse (oder der Wiederaufnahme) etwa das selbe wie bei Flush, nämlich den Buffer leeren, gemacht wird. Hast Du ne Idee wo ich zu dem Thema gute und ausführliche Informationen finden kann?

yeti

Re: C printf

Beitrag von yeti » 09.03.2010 01:50:58

Scau mal in 'man 3 setvbuf'.

Garnicht gepufferte Ausgabe mittels "setvbuf(stdout, (char *) NULL, _IONBF, 0);" oder nur einen Zeilenpuffer mittels "setvbuf(stdout, (char *) NULL, _IOLBF, 0);" scheint mir zu sein, was Du suchst.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: C printf

Beitrag von gms » 09.03.2010 06:00:52

rbv hat geschrieben: Mir ist aufgefallen, wenn ich ein usleep(2); nach dem printf benutze, habe ich das oben angesprochene Verhalten nicht.
kannst du uns noch etwas mehr über die Umgebung dieses Programms erzählen ( wird die Ausgabe irgendwie umgeleitet, in welchem Terminal lauft das Programm... ), denn "normal" ist das von dir aufgezeigte Verhalten nicht, stdout "sollte" eigentlich zumindest den von yeti erwähnten Zeilenpuffer verwenden

rbv
Beiträge: 20
Registriert: 08.03.2010 21:46:44

Re: C printf

Beitrag von rbv » 09.03.2010 08:12:14

Das ist ja seltsam: in xterm läuft das Beispiel von oben ganz normal. Ebenso auf tty2, nur in KDE-Konsole ist das komische Verhalten nachvollziehbar.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: C printf

Beitrag von gms » 09.03.2010 11:48:30

hm, bei mir funkt das auch in der KDE-Konsole
ich suche mal, ob bei Debian diesbezüglich ein Bug bekannt ist...

rbv
Beiträge: 20
Registriert: 08.03.2010 21:46:44

Re: C printf

Beitrag von rbv » 09.03.2010 22:42:07

Vielleicht Debian Debian Bugreport535334, ich suche morgen mal bei KDE direkt.
Zuletzt geändert von Danielx am 10.03.2010 09:30:01, insgesamt 1-mal geändert.
Grund: Bug-Tag hinzugefügt

Antworten