Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
rbv
- Beiträge: 20
- Registriert: 08.03.2010 21:46:44
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
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
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
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
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
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
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
Beitrag
von rbv » 09.03.2010 22:42:07
Vielleicht Debian
535334, 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