Seltsame Beobachtung

K

kotzkroete

Doppel-As
Tach,
ich war grad am Assembler programmieren, als ich was sehr seltsames gemerkt habe, ich schreibe den code jedoch lieber in C, da das wohl etwas bekannter ist (In Assembler verhaelt sich das Programm genauso):
Code:
#include <stdio.h>
typedef char byte;

int main() {
        byte my_buffer[500] = { 0 };

        read(0, my_buffer, 500);
        printf("you entered: ");
        write(1, my_buffer, 500);
        return 0;
}
Was also passieren sollte: Von der Tastatur einlesen, "you entered: " ausgeben, den string ausgeben.

Aber was wirklich passiert: Von der Tastatur einlesen, den string ausgeben, "you entered: " ausgeben.

Ich habe das Programm mal im debugger getestet und da wurde "you entered: " gar nicht ausgegeben.

Sehr skurril, weiss jemand woher das kommt? Ich kenn mich leider zu wenig mit den Syscalls write und read aus, Ich glaube, dass es an read liegt.
 
Sehr skurril, weiss jemand woher das kommt? Ich kenn mich leider zu wenig mit den Syscalls write und read aus, Ich glaube, dass es an read liegt.

Es liegt weder an read noch an write sondern an printf. Bei printf bzw. allen Funktionen die mit File-Streams arbeiten (siehe C von A bis Z) wird die Ausgabe bzw. Eingabe zunächst gepuffert. read und write sind Low-Level-Funktionen und schreiben direkt auf die Standard-Aus- bzw. Eingabe.

Man kann den Ausgabe-Puffer manuell durch die Funktion fflush() (siehe Man-Page) leeren. Versuche das mal nach printf und du wirst sehen, dass dies Ausgaben jetzt die richtige Reihenfolge haben.
Code:
#include <stdio.h>
typedef char byte;

int main() {
        byte my_buffer[500] = { 0 };

        read(0, my_buffer, 500);
        printf("you entered: ");
        fflush(stdout);
        write(1, my_buffer, 500);
        return 0;
}
Oder ersetzte den printf-Aufruf auch durch ein write.

Gruß,
Philip
 
Zuletzt bearbeitet:
Also in C geht es. Aber in Assembler bekomme ich dann einen segmentation fault.

Edit: jetzt gehts, ich muss allerdings __sF+88 auf den Stack pushen. Warum auch immer. Stdout ist ja eigentlich 1.
 
Zuletzt bearbeitet:
Also in C geht es. Aber in Assembler bekomme ich dann einen segmentation fault.

Edit: jetzt gehts, ich muss allerdings __sF+88 auf den Stack pushen. Warum auch immer. Stdout ist ja eigentlich 1.

In C bekomme ich auch einen segmentation fault, wenn ich statt stdout eine 1 eingebe. Allerdings warnt mich der Compiler auch schon:
Code:
 Warnung: Übergabe des Arguments 1 von »fflush« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
Schau mal in die Man-page von fflush. fflush erwartet kein int (Dateideskriptor) wie z.B. write, sondern einen Zeiger vom Typ FILE (ist eine Strukur) und hinter den Makros stdin,stdout,stderr steckt in C auch ein Zeiger vom Typ FILE.

Du könntest alternativ eine 0 an fflush übergeben:
If the stream argument is NULL, fflush() flushes all open output streams.

Gruß,
Philip
 
Tja....das wusste ich nicht, jetzt bin ich schlauer.
Aber das mit dem buffern und printf hab ich noch nicht richtig verstanden. Bei scanf ist mir das klar, aber printf versteh ich nicht. C von A bis Z bschaeftigt sich leider mehr mit scanf :/
Gibts zu dem Thema irgendwelche Dokumentation/
 

Ähnliche Themen

Ubuntu X / dbus problem

wirre zeichen :(

Zeilenanzahl der Konsole im C-Programm nutzen

fußballstatistik auswerten

Bei PostgreSQL als anderer als der angemeldete Nutzer verbinden - Wo liegt der Fehler

Zurück
Oben