Seltsame Beobachtung

Dieses Thema im Forum "C/C++" wurde erstellt von kotzkroete, 19.07.2007.

  1. #1 kotzkroete, 19.07.2007
    kotzkroete

    kotzkroete Doppel-As

    Dabei seit:
    22.10.2006
    Beiträge:
    132
    Zustimmungen:
    0
    Ort:
    /germany/berlin/zehlendorf
    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.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 SkydiverBS, 19.07.2007
    Zuletzt bearbeitet: 19.07.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    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
     
  4. #3 kotzkroete, 19.07.2007
    Zuletzt bearbeitet: 19.07.2007
    kotzkroete

    kotzkroete Doppel-As

    Dabei seit:
    22.10.2006
    Beiträge:
    132
    Zustimmungen:
    0
    Ort:
    /germany/berlin/zehlendorf
    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.
     
  5. #4 SkydiverBS, 19.07.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    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:
    Gruß,
    Philip
     
  6. #5 kotzkroete, 20.07.2007
    kotzkroete

    kotzkroete Doppel-As

    Dabei seit:
    22.10.2006
    Beiträge:
    132
    Zustimmungen:
    0
    Ort:
    /germany/berlin/zehlendorf
    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/
     
  7. #6 SkydiverBS, 20.07.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Habe gerade mal bei Google gesucht und eine gute Beschreibung gefunden: stdio buffering.
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Seltsame Beobachtung

Die Seite wird geladen...

Seltsame Beobachtung - Ähnliche Themen

  1. Imagemagicks Mogrify macht Seltsames ....

    Imagemagicks Mogrify macht Seltsames ....: Immer, wenn ich eine Reihe JPGs qualitativ heruntersetzen will, funktioniert es prima per ---------- mogrify -quality 20 *.JPG ----------...
  2. Seltsames Verhalten des Paketmanagements

    Seltsames Verhalten des Paketmanagements: Hallo zusammen, ich bin erst seit ein paar Wochen bei Centos, ich benutze es zum Programmieren. Ich habe nach Anleitungen aus dem Web, Centos...
  3. Seltsames ACPI/Akkuproblem

    Seltsames ACPI/Akkuproblem: Hallo Leute, habe ein komisches Problem auf meinem Acer TimelineX 4820TG: (Das installierte System ist übrigens ZevenOS Neptune 2.0, also ein...
  4. Datei-Besitzer / Zugriffsrechte am Client ändern Seltsames Verhalten von Samba

    Datei-Besitzer / Zugriffsrechte am Client ändern Seltsames Verhalten von Samba: Hallo Linux-Gemeinde, seit einigen Wochen beschäftige ich mich intensiv mit Ubuntu, bislang recht zufriedenstellend, habe viel gesucht und gelesen...
  5. lighttpd - seltsame Einträge in der access.log (vulnerability scanner, etc.)

    lighttpd - seltsame Einträge in der access.log (vulnerability scanner, etc.): Hallo, ich besitze seit geraumer Zeit einen kleinen vServer bei dem Anbieter www.proplay.de (die Server stehen bei Hetzner) und wundere mich nun...