Был ли символ «\0» в конце каждого скрипта?

Был ли символ «\0» в конце каждого скрипта?

Мне интересно, как вы определили конец скрипта/файла? Меня особенно интересуют старые версии Unix (типа V6).

Есть ли «\0» после последнего написанного символа?

решение1

Программы Userland даже в старых Unix не видели байты "заполнения" в конце файла. Я знаю, что MS-DOS или CP/M заполняли бы блоки диска символами Ctrl-Z, поэтому алгоритм чтения файла должен был не только проверять блоки конца диска, но и проверять байты заполнения.

Unix никогда не делал ничего подобного. Программы считывают байты до тех пор, пока не наступит конец файла, что для системного read(2)вызова означает возврат 0. К сожалению, долго выполняющийся системный вызов может быть прерван, что приведет read()к возврату кода ошибки (-1), а глобальный символ errnoбудет оценен как EINTR, поэтому Unix также традиционно вносит некоторую глупость в чтение определенных устройств.

Во всем этом есть также аспект файловой системы: файловые системы Unix помещали данные в дисковые блоки и сохраняли значение размера файла в байтах в inode. Некоторые другие ОС сохраняли размер файла только в блоках. Если данные были меньше блока, проблема всплывала в пользовательском пространстве с байтами pad или прочей ерундой.

решение2

Не обязательно. Интерпретатор оболочки считывает файл со скриптом, используя некоторую (более или менее сложную) оболочку системного вызова (например, read()) fread(), и это будет сигнализировать о состоянии конца файла, когда достигнет последнего байта файла (который не обязательно должен быть нулевым).

Связанный контент