In Unix sind die meisten Objekte, die Sie lesen und schreiben können - normale Dateien, Pipes, Terminals, Raw-Laufwerke - alle so angelegt, dass sie Dateien ähneln.
Ein Programm wie cat
liest von seiner Standardeingabe wie folgt:
n = read(0, buffer, 512);
das fragt nach 512 Bytes. n
ist die Anzahl der tatsächlich gelesenen Bytes oder -1, wenn ein Fehler vorliegt.
Wenn Sie dies wiederholt mit einer normalen Datei durchgeführt haben, erhalten Sie eine Reihe von Lesevorgängen von 512 Byte, dann einen etwas kürzeren Lesevorgang am hinteren Ende der Datei und dann den Wert 0, wenn Sie versucht haben, nach dem Ende der Datei zu lesen. Läuft so lange, cat
bis n
<= 0 ist.
Das Lesen von einem Terminal ist etwas anders. Nachdem Sie eine mit der EnterTaste abgeschlossene read
Zeile eingegeben haben, wird nur diese Zeile zurückgegeben.
Es gibt einige Sonderzeichen, die Sie eingeben können. Eins ist Ctrl-D. Wenn Sie dies eingeben, sendet das Betriebssystem die gesamte aktuelle Zeile, die Sie eingegeben haben (jedoch nicht die Zeile Ctrl-Dselbst), an das Programm, das den Lesevorgang ausführt. Und hier ist der Zufall: Wenn Ctrl-Des sich um das erste Zeichen in der Zeile handelt, wird dem Programm eine Zeile mit der Länge 0 gesendet - genau wie das Programm sehen würde, wenn es gerade am Ende einer normalen Datei angelangt wäre. cat
Es muss nichts anders gemacht werden , egal ob es sich um das Lesen aus einer normalen Datei oder einem Terminal handelt.
Eine weitere Besonderheit ist Ctrl-Z. Wenn Sie es an einer beliebigen Stelle in einer Zeile eingeben, verwirft das Betriebssystem alles, was Sie bis dahin eingegeben haben, und sendet ein SIGTSTP-Signal an das Programm, das es normalerweise anhält (anhält) und die Kontrolle an die Shell zurückgibt.
Also in deinem Beispiel
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
Sie haben einige Zeichen eingegeben, die verworfen wurden, und wurden dann cat
gestoppt, ohne etwas in die Ausgabedatei geschrieben zu haben.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
Sie haben eine Zeile eingegeben, die cat
die Ausgabedatei gelesen und in diese geschrieben hat, und dann die Ctrl-Zangehaltene cat
.