¿Había un '\0' al final de cada script?

¿Había un '\0' al final de cada script?

Me pregunto cómo determinaste el final de un script/archivo. Estoy especialmente interesado en las versiones antiguas de Unix (como V6).

¿Hay un '\0' después del último carácter escrito?

Respuesta1

Los programas de usuario en Unixes aún más antiguos no veían bytes "pad" al final de un archivo. Sé que MS-DOS o CP/M llenarían bloques de disco con caracteres Ctrl-Z, por lo que un algoritmo de lectura de archivos no solo tenía que verificar los bloques de fin de disco, sino que también tenía que verificar los bytes de relleno.

Unixes nunca hizo ese tipo de cosas. Los programas leen bytes hasta que ocurre la condición de fin de archivo, lo que para la read(2)llamada al sistema significa devolver 0. Desafortunadamente, una llamada al sistema de larga duración puede interrumpirse, lo que provoca read()que se devuelva el código de error (-1) y el símbolo global errnoevalúa a EINTR, por lo que Unixes también introduce tradicionalmente algunas tonterías en la lectura de ciertos dispositivos.

También hay un aspecto de sistema de archivos en todo esto: los sistemas de archivos Unix colocarían datos en bloques de disco y mantendrían un valor de tamaño de archivo en bytes en el inodo. Algunos otros sistemas operativos sólo mantenían el tamaño del archivo en bloques. Si los datos eran más pequeños que un bloque, el problema surgía en el territorio del usuario, con bytes de pad u otras tonterías.

Respuesta2

No necesariamente. El intérprete de shell lee el archivo con el script usando algún contenedor de llamada al sistema (más o menos complejo) (por ejemplo, read()of fread()) y eso indicará la condición de fin de archivo cuando llegue al último byte del archivo (que no necesita ser cero).

información relacionada