Havia um '\0' no final de cada script?

Havia um '\0' no final de cada script?

Estou me perguntando como você determinou o final de um script/arquivo? Estou especialmente interessado em versões antigas do Unix (como V6).

Existe um '\0' após o último caractere escrito?

Responder1

Os programas Userland em Unixes ainda mais antigos não viam bytes de "preenchimento" no final de um arquivo. Eu sei que o MS-DOS ou o CP/M preencheriam blocos de disco com caracteres Ctrl-Z, portanto, um algoritmo de leitura de arquivo não apenas precisava verificar os blocos de fim de disco, mas também verificava os bytes de preenchimento.

Unixes nunca fizeram esse tipo de coisa. Os programas leem bytes até que a condição de fim de arquivo aconteça, o que para a read(2)chamada do sistema significa retornar 0. Infelizmente, uma chamada do sistema de longa duração pode ser interrompida, o que faz com que read()o código de erro (-1) seja retornado e o símbolo global errnoseja avaliado ao EINTR, então os Unixes também introduzem tradicionalmente algumas bobagens na leitura de certos dispositivos.

Há também um aspecto do sistema de arquivos em tudo isso: os sistemas de arquivos Unix colocariam dados em blocos de disco e manteriam um valor de tamanho de arquivo em bytes no inode. Alguns outros sistemas operacionais mantinham apenas o tamanho do arquivo em blocos. Se os dados fossem menores que um bloco, o problema se espalharia pela área do usuário, com bytes de preenchimento ou outras bobagens.

Responder2

Não necessariamente. O interpretador shell lê o arquivo com o script usando algum wrapper syscall (mais ou menos complexo) (por exemplo, read()of fread()) e isso sinalizará a condição de fim do arquivo quando atingir o último byte do arquivo (que não precisa ser zero).

informação relacionada