Ich frage mich, wie Sie das Ende eines Skripts / einer Datei derterminiert haben. Ich interessiere mich besonders für alte Unix-Versionen (wie V6).
Gibt es nach dem letzten geschriebenen Zeichen ein '\ 0'?
Ich frage mich, wie Sie das Ende eines Skripts / einer Datei derterminiert haben. Ich interessiere mich besonders für alte Unix-Versionen (wie V6).
Gibt es nach dem letzten geschriebenen Zeichen ein '\ 0'?
Antworten:
Userland-Programme unter noch älteren Unixen sahen am Ende einer Datei keine "Pad" -Bytes. Ich weiß, dass MS-DOS oder CP / M Plattenblöcke mit Strg-Z-Zeichen füllen würden, sodass ein Algorithmus zum Lesen von Dateien nicht nur nach Plattenendblöcken suchen musste, sondern auch nach Auffüllbytes.
Unixes haben so etwas nie gemacht. Programme lesen Bytes, bis der Dateiende-Zustand read(2)
eintritt , was für den Systemaufruf die Rückgabe von 0 bedeutet. Leider kann ein lang laufender Systemaufruf unterbrochen werden, wodurch read()
der Fehlercode (-1) zurückgegeben wird und das globale Symbol errno
ausgewertet wird zu EINTR, so führen Unixe auch traditionell etwas Dummheit in das Lesen bestimmter Geräte ein.
Dies alles hat auch einen Dateisystemaspekt: Unix-Dateisysteme würden Daten in Plattenblöcke einfügen und einen Wert für die Dateigröße in Bytes im Inode beibehalten. Einige andere Betriebssysteme haben die Dateigröße nur in Blöcken beibehalten. Wenn die Daten kleiner als ein Block waren, stieg das Problem mit Pad-Bytes oder anderem Unsinn in das Benutzerland auf.
Nicht unbedingt. Der Shell-Interpreter liest die Datei mit dem Skript unter Verwendung eines (mehr oder weniger komplexen) Syscall-Wrappers (z. B. read()
von fread()
), der den Zustand des Dateiende signalisiert, wenn er das letzte Byte der Datei erreicht (was nicht erforderlich ist) Null sein).