2014-01-26 7 views
25

Ich bin ratlos durch die Frage 1.5.2 in K & R. Ich googelte für einige Zeit und fand heraus, dass ich den EOF-Eingang nach Eingabe der Zeichen liefern muss.Signal EOF in MacOSX-Terminal

Ich versuchte Commnad-D und Control-D als EOF-Eingänge, aber nichts hat funktioniert. Irgendeine Idee, wie man das EOF für Mac OSX liefert?

+2

https://discussions.apple.com/message/11198745#11198745 – Dave

Antwort

48

standardmäßig OS X (früher Mac OS X) Terminals erkennt EOF wenn Ctrl - D am Anfang einer Zeile gedrückt wird.

Im Detail wird der eigentliche Betrieb ist, dass, wenn Ctrl - D gedrückt wird, werden alle Bytes in dem Eingangspuffer des Terminals sind an den laufenden Prozess gesendet, um den Terminal. Am Anfang einer Zeile befinden sich keine Bytes im Puffer, daher wird dem Prozess mitgeteilt, dass null Bytes verfügbar sind, und dies fungiert als Indikator EOF.

dieses Verfahren als ein Verfahren verdoppelt sich für den Prozess vor dem Ende einer Zeile zu liefern: der Benutzer einige Zeichen eingeben kann und Ctrl drücken - D, und die Zeichen werden dem Prozess sofort gesendet werden, ohne das übliche Warten auf Enter/Return gedrückt zu werden. Nachdem die Operation "Alle gepufferten Bytes sofort senden" ausgeführt wurde, verbleiben keine Bytes mehr im Puffer. Also, wenn Ctrl - D ein zweites Mal gedrückt wird, ist es das gleiche wie der Anfang einer Zeile (keine Bytes gesendet werden, und der Prozess wird Null Bytes), und es verhält sich wie ein EOF.

Sie können mehr über Terminal-Verhalten lernen, indem Sie den Befehl "man 4 tty" in Terminal verwenden. Die Standardzeilendisziplin ist Termios. Mit dem Befehl man termios können Sie mehr über die Disziplin termios line erfahren.

+0

Können Sie mir helfen zu verstehen, wie 'getchar()' funktioniert? Ich dachte, Char kann nur einen Charakter gleichzeitig halten. Wenn ich eine Zeichenfolge wie "hdjshj" in das Terminal eingeben und das Ende der Datei eingeben, speichert "getchar" den gesamten Stich der Zeichen auf einmal?Oder speichert es das Zeichen, sobald es in das Terminal eingegeben wurde, und speichert es ab, wenn der EOF auftritt? – Morpheus

+3

@Morpheus: Die Verarbeitung von Zeichen, die ich in meiner Antwort diskutiere, ist unter/vor 'getchar' sieht die Zeichen. 'getchar' ist Teil der Software in Ihrem Programm (verlinkt aus Software-Bibliotheken), die Dateien und Puffer verwaltet. Diese Software ruft so etwas wie einen "gelesenen" Systemaufruf auf, um Bytes zu erhalten. Separat gibt es Software, die das "Terminal" -Fenster, das Sie sehen, und Software, die Zeichen von der Tastatur liest, bedient. Die Terminal-Software empfängt Zeichen von der Tastatur (durch zusätzliche Schichten von Systemsoftware) und verarbeitet sie. ... –

+2

@Morpheus: ... Normalerweise merkt sich die Terminal-Software gewöhnliche Zeichen in einem Puffer, den sie auf verschiedene Arten verwaltet und verarbeitet. Z. B. kann es, wenn es ein Steuer-C sieht, ein Signal an den laufenden Prozess senden, um es zu unterbrechen. Wenn es eine Rückkehr/Eingabe sieht, sendet es die gepufferten Zeichen und die Rückgabe/Eingabe an den laufenden Prozess. Wenn auf diese Weise Zeichen an den laufenden Prozess gesendet werden, gibt der "read" Systemaufruf sie an den Aufrufer zurück. Der Aufrufer ist Teil dieser Software, die Dateien und Puffer in Ihrem Programm verwaltet. ... –

7

Ich habe es gerade herausgefunden. Sie müssen drücken Ctrl + D + D. Halten Sie die Steuerung gedrückt und drücken Sie zweimal D. Ich muss sagen, was für eine komische Tastenfolge.

+0

Dies beantwortet nicht die Frage: "Irgendeine Idee, wie Sie die EOF für Mac OSX liefern?" – user3629249

+0

Es funktioniert auf Mac! Danke – Hoto

8

Wenn Sie sehen wollen, was EOF wie in Ihrem Terminal gesetzt, Sie

stty all 

auf meinem Mac geben kann, gibt dies den Ausgang -

speed 9600 baud; 24 rows; 80 columns; 
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl 
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo 
-extproc 
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8 
-ignbrk brkint -inpck -ignpar -parmrk 
oflags: opost onlcr -oxtabs -onocr -onlret 
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow 
-dtrflow -mdmbuf 
discard dsusp eof  eol  eol2 erase intr kill lnext 
^O  ^Y  ^D  <undef> <undef> ^?  ^C  ^U  ^V  
min  quit reprint start status stop susp time werase 
1  ^\  ^R  ^Q  ^T  ^S  ^Z  0  ^W  

Sie vier Linien sehen können von unten sind drei Zellen in eof^D.

Es gibt eine ausführlichere Beschreibung here wo ich die Informationen gefunden habe.