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

7

Eu estou querendo saber como você dertermine o fim de um script / arquivo? Estou especialmente interessado em versões antigas do Unix (como V6).

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

    
por Joey 05.01.2015 / 22:21

2 respostas

12

Programas Userland sob Unixes mais antigos não viram bytes "pad" no final de um arquivo. Eu sei que o MS-DOS ou CP / M preencheria blocos de disco com caracteres Ctrl-Z, portanto, não apenas um algoritmo de leitura de arquivos precisava verificar os blocos de fim de disco, mas também verificar os bytes de preenchimento. / p>

Unixes nunca fizeram esse tipo de coisa. Programas leem bytes até que a condição de fim de arquivo aconteça, que para a chamada de sistema read(2) significa retornar 0. Infelizmente, uma chamada de sistema de longa execução pode ser interrompida, o que faz com que read() retorne o código de erro (-1) , e o símbolo global errno é avaliado como EINTR, então os Unixes também introduzem, de maneira tradicional, algum disfarce na leitura de certos dispositivos.

Há também um aspecto de sistema de arquivos para tudo isso: 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 borbulhava na terra do usuário, com bytes de preenchimento ou outras bobagens.

    
por 05.01.2015 / 22:45
4

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

    
por 05.01.2015 / 22:29