
Мне интересно, как вы определили конец скрипта/файла? Меня особенно интересуют старые версии 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()
, и это будет сигнализировать о состоянии конца файла, когда достигнет последнего байта файла (который не обязательно должен быть нулевым).