Ich bin ratlos über die 1.5.2-Frage in K & R. Ich habe einige Zeit gegoogelt und herausgefunden, dass ich die EOF-Eingabe nach der Eingabe der Zeichen liefern muss.
long nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
return 0;
Ich habe sowohl Befehls-D als auch Steuerungs-D als EOF-Eingaben ausprobiert, aber nichts hat funktioniert. Irgendeine Idee, wie man das EOF für Mac OS X bereitstellt?
Standardmäßig erkennt macOS (ehemals OS X und Mac OS X) Software EOF Wenn Steuerung-D wird am Anfang einer Zeile gedrückt. (Ich glaube, dieses Verhalten ist auch für andere Unix-Versionen ähnlich.)
Im Detail ist die eigentliche Operation das, wann Steuerung-D gedrückt wird, werden alle Bytes im Eingangspuffer des Terminals unter Verwendung des Terminals an den angefügten/Vordergrundprozess gesendet. 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 eine EOF Indikator.
Dieses Verfahren dient gleichzeitig als Methode zum Liefern von Eingaben für den Prozess vor dem Ende einer Zeile: Der Benutzer kann einige Zeichen eingeben und drücken Steuerung-D, und die Zeichen werden sofort an den Prozess gesendet, ohne das übliche Warten auf das Drücken der Eingabetaste/Eingabetaste. Nachdem diese Operation „alle gepufferten Bytes sofort senden“ ausgeführt wurde, verbleiben keine Bytes im Puffer. Also, wann Steuerung-D ein zweites Mal gedrückt wird, ist dies dasselbe wie der Anfang einer Zeile (es werden keine Bytes gesendet, und der Prozess erhält null Bytes), und es verhält sich wie ein EOF.
Sie können mehr über das Verhalten von Terminals erfahren, indem Sie den Befehl „man 4 tty“ in Terminal verwenden. Die Standardliniendisziplin ist termios. Sie können mehr über die termios Liniendisziplin erfahren, indem Sie den Befehl verwenden man termios.
Können Sie mir helfen zu verstehen, wie getchar() funktioniert? Ich dachte, get char kann nur ein Zeichen gleichzeitig enthalten. Wenn ich eine Zeichenfolge wie eingebe hdjshj in das Terminal ein und geben Sie das Dateiende ein, will getchar den ganzen Stachel der Zeichen auf einmal speichern? Oder speichert es das Zeichen, sobald es in das Terminal eingegeben wird, und hört auf, es zu speichern, wenn das EOF auftritt?
– Morpheus
27. Januar 2014 um 13:42 Uhr
@Morpheus: Die Verarbeitung von Zeichen, die ich in meiner Antwort bespreche, ist unten / davor getchar sieht die Charaktere. getchar ist Teil der Software in Ihrem Programm (aus Softwarebibliotheken eingebunden), die Dateien und Puffer verwaltet. Diese Software ruft so etwas wie a read Systemaufruf, um Bytes zu erhalten. Unabhängig davon gibt es Software, die das angezeigte „Terminal“-Fenster bedient, und Software, die Zeichen von der Tastatur liest. Die Terminalsoftware empfängt Zeichen von der Tastatur (über zusätzliche Schichten der Systemsoftware) und verarbeitet sie.…
– Eric Postpischil
27. Januar 2014 um 14:49 Uhr
@Morpheus: … Normalerweise merkt sich die Terminalsoftware gewöhnliche Zeichen in einem Puffer, den sie verwaltet, und verarbeitet Sonderzeichen auf verschiedene Weise. Wenn es zB ein Control-C sieht, kann es ein Signal an den laufenden Prozess senden, um ihn zu unterbrechen. Wenn es ein Return/Enter sieht, sendet es die gepufferten Zeichen und das Return/Enter an den laufenden Prozess. Wenn Zeichen auf diese Weise an den laufenden Prozess gesendet werden, werden die read Systemaufruf gibt sie an den Aufrufer zurück. Der Aufrufer ist Teil dieser Software, die Dateien und Puffer in Ihrem Programm verwaltet.…
– Eric Postpischil
27. Januar 2014 um 14:51 Uhr
@Morpheus: … Diese Software hat ihren eigenen Puffer. Wenn du anrufst getchar, zieht es ein Zeichen aus diesem Puffer, falls dort eines vorhanden ist. (Wenn dies nicht der Fall ist, wird angefordert, dass der Puffer gefüllt wird, was zu einem anderen führt read Anruf wird ausgeführt.) getchar hat nur einen garantierten Platz wo ungetchar kann ein Zeichen zurücksetzen, aber es können mehrere Zeichen im internen Puffer vorhanden sein. (Es gibt verschiedene Möglichkeiten, einen Teil dieser Pufferung auszuschalten, damit Sie Zeichen direkter vom Terminal lesen können, aber die meisten Programme müssen dies nicht tun.)
– Eric Postpischil
27. Januar 2014 um 14:53 Uhr
Wenn Sie sehen möchten, wie EOF in Ihrem Terminal eingestellt ist, können Sie Folgendes eingeben
Sie können vier Zeilen von unten sehen, drei Zellen in eof sind ^D.
Es gibt eine ausführlichere Beschreibung hier wo ich die infos gefunden habe.
Morpheus
Ich habe es gerade herausgefunden. Sie müssen drücken Strg+D+D. Halten Sie den Regler gedrückt und drücken Sie D zweimal. Ich muss sagen, was für eine seltsame Tastenfolge.
dies beantwortet nicht die Frage: “Irgendeine Idee, wie man das EOF für Mac OSX bereitstellt?”
– Benutzer3629249
26. September 2015 um 3:00 Uhr
Sie sollten das gleiche Verhalten erhalten, wenn Sie zweimal Strg-D ausführen (dh das kontinuierliche Halten von Strg ist nicht relevant).
– MM
7. Juli 2019 um 3:27 Uhr
14013600cookie-checkSignal EOF im Mac OSX-Terminalyes
Discussions.apple.com/message/11198745#11198745
– David
26. Januar 2014 um 14:03 Uhr