Jasmin: STDIN von der Kommandozeile abbrechen?

Hallo,

angenommen ein Programm liest von STDIN und ich gebe deswegen auf der DOS-Kommandozeile einen Text ein. Wie kann ich dies abbrechen, wenn ich im Programm keine Abruchbedingung a la "zeile = ''" eingebaut habe?

Grüße
Jasmin

  1. Hello,

    Hallo,

    angenommen ein Programm liest von STDIN und ich gebe deswegen auf der DOS-Kommandozeile einen Text ein. Wie kann ich dies abbrechen, wenn ich im Programm keine Abruchbedingung a la "zeile = ''" eingebaut habe?

    Ich weiß nicht, ob ich Dich richtig verstehe, aber meitest Du vielleicht CTRL-Z ?

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,

      angenommen ein Programm liest von STDIN und ich gebe deswegen auf der DOS-Kommandozeile einen Text ein. Wie kann ich dies abbrechen, wenn ich im Programm keine Abruchbedingung a la "zeile = ''" eingebaut habe?
      Ich weiß nicht, ob ich Dich richtig verstehe, aber meitest Du vielleicht CTRL-Z ?

      Ja, hurra das funktioniert. Geht das auch bei Linux?

      Grüße
      Jasmin

      1. Hello,

        Ich weiß nicht, ob ich Dich richtig verstehe, aber meitest Du vielleicht CTRL-Z ?
        Ja, hurra das funktioniert. Geht das auch bei Linux?

        Das sollte auch bei Linux funktionieren.
        CTRL-Z bricht aber die Eingabe nicht ab, sondern beendet sie ordnungsgemäß.
        Es wird an den String eine ASCII-NUL angehängt, wewegen man den dann auch ASCII-Z-String (Zero terminated) nennt. Das ist für Dein weiterverarbeitendes Programm von Bedeutung, wenn es die Länge des Strings ermitteln will.

        Abbrechen kannst Du mit CRTL-C, wenn das Break-Flag von der Applikation abgefragt wird.
        Das geschieht aber bei DOS schon im BIOS und wird dann meistens in die höheren Schichten übernommen.

        Wie Linux damit umgeht, kann ich Dir aber leider (noch) nicht sagen :-)

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. hallo,

          Wie Linux damit umgeht, kann ich Dir aber leider (noch) nicht sagen :-)

          Strg+Z habe ich noch nie verwendet, Strg+C bricht einen laufenden Prozeß einschließlich aller seiner Unterprozesse ab. Beispiel: du startest auf der ersten Konsole (tty1) den X-Server mit startx. Es startet der X-Server und je nach deiner Auswahl die grafische Oberfläche. Vielleicht läßt du mehrere Sachen laufen - einen Browser, ein Textverarbeitungsprogramm usw. Wenn du mit Strg+Alt+F1 auf die erste Konsole zurückgehst, kannst du mit Strg+C alles auf einen Rutsch killen. Sollte in dieser Größenordnng allerdings nicht nötig sein.

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
        2. Hi,

          CTRL-Z bricht aber die Eingabe nicht ab, sondern beendet sie ordnungsgemäß.

          richtig, denn Ctrl-Z ist als ASCII-Steuerzeichen EOF (End Of File) definiert.

          Es wird an den String eine ASCII-NUL angehängt, ...

          DAS ist wiederum Sache der Applikation. Das Betriebssystem selbst gibt über den Stream stdin nach den Nutzdaten lediglich das Ctrl-Z weiter; der nächste Leseversuch ergibt dann je nach Implementierung entweder einen Fehler (input past end of file) oder wiederholt das EOF-Zeichen.
          Eine Anwendung *kann* von sich aus das Ctrl-Z durch ein NUL ersetzen oder auch noch ein NUL hinten dranhängen; automatisch passiert das aber zumindest bei DOS und Windows nicht - und ich vermute, auch bei Linux nicht.

          Abbrechen kannst Du mit CRTL-C, wenn das Break-Flag von der Applikation abgefragt wird.
          Das geschieht aber bei DOS schon im BIOS und wird dann meistens in die höheren Schichten übernommen.

          Nein. Vom BIOS wird nur die Kombination Ctrl-Break abgefragt, bei deren Erkennen dann ein Interrupt (INT 1Bh) ausgelöst wird. Die Default-Interruptroutine im BIOS setzt tatsächlich nur ein Flag, das diesen Zustand anzeigt. Das Zeichen Ctrl-C ist für die BIOS-Funktionen eine Eingabe wie jedes andere ASCII-Zeichen auch.
          Die I/O-Funktionen von DOS fragen ihrerseits dieses Flag ab, reagieren aber zusätzlich auch auf Ctrl-C mit einem Abbruch.

          Schönen Abend noch,
           Martin

          --
          Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
          Wer will meine haben? Denn ich will sie bstimmt nicht.
          1. Hi,

            CTRL-Z bricht aber die Eingabe nicht ab, sondern beendet sie ordnungsgemäß.

            richtig, denn Ctrl-Z ist als ASCII-Steuerzeichen EOF (End Of File) definiert.

            Unter Unix steht Ctrl-D für EOF: http://de.wikipedia.org/wiki/End_of_File

            mfG,
            steckl

            1. Hello,

              Unter Unix steht Ctrl-D für EOF: http://de.wikipedia.org/wiki/End_of_File

              Eigentlich für EOT (End of Transmission) was aber beim Lesen von der Standardeingabe auf das Gleiche herauskommen sollte.

              Ein harzliches Glückauf

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
          2. Hello,

            Nein. Vom BIOS wird nur die Kombination Ctrl-Break abgefragt,

            Abgefragt wird das "Control Break Flag" oder auch "Control-C-Flag" bei DOS mit dem API-Interrupt 12h, Funktion 33h, Unterfunktion 00h. Mit der Unterfunktion 01h kann man es übrigens auch setzen.

            Gesetzt wird es üblicherweise auch vom Handler des Tastatur-Interrupts, der natürlich vom OS ersetzt werden kann, aber nicht muss. Das meinte ich mit "wird meistens in die höheren Schichten übernommen".

            Der hängt auf dem INT 09h am IRQ 01h
            Und der Standerd-INT 09h des BIOS ruft dann den INT 1Bh auf, der aber üblicherweise vom OS geliefert wird.

            Ein harzliches Glückauf

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              sollte natürlich 21h heißen!

              Abgefragt wird das "Control Break Flag" oder auch "Control-C-Flag" bei DOS mit dem API-Interrupt 21h, Funktion 33h, Unterfunktion 00h. Mit der Unterfunktion 01h kann man es übrigens auch setzen.

              Ein harzliches Glückauf

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
      2. Hallo!

        Ich weiß nicht, ob ich Dich richtig verstehe, aber meitest Du vielleicht CTRL-Z ?
        Ja, hurra das funktioniert. Geht das auch bei Linux?

        Unter Linux ist das Defaultmäßig Ctrl+D, weil Ctr+Z für "Prozess unterbrechen" reserviert ist. Aber man kann das auch ändern, auf der Kommandozeile kann man zum Beispiel folgendes eingeben:

        stty susp undef eof ^Z

        Für alle danach gestarteten Programme auf der gleichen Kommandozeile gilt dann: Es gibt eine Tastenkombination mehr, um den Prozess zu unterbrechen, es Ctrl+Z ist dann aber die Tastenkombination für EOF - damit reagiert das dann wie Windows. Wenn man's wieder zurücksetzen will:

        stty susp ^Z eof ^D

        (Oder einfach das aktuelle Fenster schließen und ein neues öffnen)

        Viele Grüße,
        Christian