write hat Vorrang vor printf (Problem mit Eclipse?)



  • Hier ein kurzes Code-Beispiel mit printf und write:

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
    	char* t1 = "Text 1\n";
    	char* t2 = "Text 2\n";
    
    	printf("%s", t1);
    	write(1, t2, 7);
    
    	return 0;
    }
    

    Normalerweise würde ich jetzt erwarten, dass man zuerst "Text 1" und danach "Text 2" auf dem Bildschirm sehen kann. Denn printf() wird ja im Programmcode vor write() aufgerufen. Tatsächlich aber sehe ich Folgendes (erzeugt mit Eclipse, CDT, MinGW unter Windows):

    Text 2
    Text 1
    

    Wie kommt denn dat nun zustande - wieso wird write anscheinend zuerst aufgerufen? 😕

    EDIT: Interessanterweise stimmt die Ausgabe, wenn man die .exe Datei an der Konsole startet. Innerhalb von Eclipse selbst jedoch ist die Ausgabe wie oben beschrieben vertauscht. Seltsam...



  • wahrscheinlich fängt das doofe eclipse den 'printf' ab, zu debugging- oder formatierungszwecken. ausserdem haben beide funktionen separate buffermechanismen, d.h. wenn printf intern write aufruft, dann sind beide buffer hintereinandergeschaltet.
    🙂



  • Versuch mal fflush(stdout) zwischen printf() und write().

    Gruß mcr



  • mcr schrieb:

    Versuch mal fflush(stdout) zwischen printf() und write().

    Yup, das behebt das Problem. Danke 🙂



  • Normalerweise würde ich jetzt erwarten, dass man zuerst "Text 1" und danach "Text 2" auf dem Bildschirm sehen kann. Denn printf() wird ja im Programmcode vor write() aufgerufen. Tatsächlich aber sehe ich Folgendes ...

    hehe, ich hab genau das Gegenteil erwartet 😉 das hat aber mit Eclipse nichts zu tun, weil Eclipse nur die IDE ist.

    write ist nicht gepuffert und deswegen schreibt sie "sofort" in den Dateideskriptor rein. printf muss nicht umbedingt sofort auf stdout schreiben, sondern wenn der Puffer voll ist. Meistens wird sofort geflusht, wenn man ein \n am Ende der Zeichenkette hat, aber mit fflush(stdout); sagst du explizit, dass alle Zeichen im Puffer geschrieben werden.



  • buffer-freak schrieb:

    wahrscheinlich fängt das doofe eclipse den 'printf' ab, zu debugging- oder formatierungszwecken.

    Wie kommst du denn auf den Unsinn?



  • Bashar schrieb:

    buffer-freak schrieb:

    wahrscheinlich fängt das doofe eclipse den 'printf' ab, zu debugging- oder formatierungszwecken.

    Wie kommst du denn auf den Unsinn?

    eclipse wird wohl die printf-ausgaben umleiten um sie in ein output/debug-window hineinzurendern. der OP schrieb ja, dass die ausgaben in der 'echten' konsole in der richtigen reihenfolge sind.
    🙂



  • Das liegt daran, dass die Standardausgabe zeilengepuffert ist, wenn sie mit einem Terminal verbunden ist. Wenn Eclipse sie abfängt, gilt das anscheinend nicht als Terminal (das sind eher Unix-Begriffe, ich weiß nicht, inwiefern man auf sowas unter Windows überhaupt Einfluss hat), sondern als Datei, d.h. der Puffer wird geflusht wenn er voll ist.
    Und natürlich fängt Eclipse die Ausgaben ab, aber nicht den Aufruf an printf, sondern die komplette Standardausgabe inklusive write, also Filedeskriptor 1 (und 2, die Standardfehlerausgabe, wahrscheinlich auch).



  • supertux schrieb:

    ...Meistens wird sofort geflusht, wenn man ein \n am Ende der Zeichenkette hat, aber mit fflush(stdout); sagst du explizit, dass alle Zeichen im Puffer geschrieben werden.

    wohl nicht immer, denn er hat ja

    char* t1 = "Text 1\n";

    sonding am ende dranne
    🙂



  • Ich schrieb deswegen ja "Meistens" 😉


Anmelden zum Antworten