Gab es am Ende jedes Skripts ein „\0“?

Gab es am Ende jedes Skripts ein „\0“?

Ich frage mich, wie Sie das Ende eines Skripts/einer Datei bestimmt haben? Ich interessiere mich besonders für alte Unix-Versionen (wie V6).

Steht nach dem letzten geschriebenen Zeichen ein '\0'?

Antwort1

Userland-Programme unter noch älteren Unix-Systemen erkannten keine „Füllbytes“ am Ende einer Datei. Ich weiß, dass MS-DOS oder CP/M Festplattenblöcke mit Strg-Z-Zeichen füllten, sodass ein Dateilesealgorithmus nicht nur nach Festplattenblock-Enden suchen musste, sondern auch nach Füllbytes.

Unixe haben so etwas nie gemacht. Programme lesen Bytes, bis das Dateiende eintritt, was für den read(2)Systemaufruf bedeutet, dass 0 zurückgegeben wird. Leider kann ein lang andauernder Systemaufruf unterbrochen werden, was dazu führt, read()dass der Fehlercode (-1) zurückgegeben wird, und das globale Symbol errnowird als EINTR ausgewertet, sodass Unixe traditionell auch beim Lesen bestimmter Geräte einige Fehler einführen.

Das Ganze hat auch einen Dateisystemaspekt: ​​Unix-Dateisysteme würden Daten in Festplattenblöcken ablegen und einen Wert für die Dateigröße in Bytes im Inode speichern. Einige andere Betriebssysteme speicherten die Dateigröße nur in Blöcken. Wenn die Daten kleiner als ein Block waren, gelangte das Problem ins Benutzerland, mit Füllbytes oder anderem Unsinn.

Antwort2

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()) und dieser signalisiert das Dateiende, wenn er das letzte Byte der Datei erreicht (das nicht Null sein muss).

verwandte Informationen