STDIN von der Kommandozeile abbrechen?
Jasmin
- sonstiges
0 Tom0 Jasmin
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
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
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
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
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.
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
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
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
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
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
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