Signal EOF im Mac OSX-Terminal

Lesezeit: 4 Minuten

Benutzeravatar von Morpheus
Morpheus

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?

Benutzeravatar von Eric Postpischil
Eric Postpischil

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

stty all

Auf meinem Mac ergibt dies die Ausgabe –

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 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.

Benutzeravatar von Morpheus
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


1401360cookie-checkSignal EOF im Mac OSX-Terminal

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy