我想知道你是如何确定脚本/文件的结尾的? 我对旧的 Unix 版本(如 V6)特别感兴趣。
最后写入的字符后面是否有“\0”?
答案1
即使是较旧的 Unix 下的用户态程序也不会在文件末尾看到“pad”字节。我知道 MS-DOS 或 CP/M 会用 Ctrl-Z 字符填充磁盘块,因此文件读取算法不仅必须检查磁盘块结尾,还必须检查填充字节。
Unix 从来没有做过这样的事情。程序读取字节,直到发生文件结束条件,这对于read(2)
系统调用意味着返回 0。不幸的是,长时间运行的系统调用可能会被中断,这会导致read()
返回错误代码 (-1),并且全局符号errno
计算到 EINTR,因此 Unix 传统上也会在读取某些设备时引入一些愚蠢的做法。
这一切还涉及文件系统方面:Unix 文件系统会将数据放入磁盘块中,并在 inode 中保留文件大小(以字节为单位)值。其他一些操作系统仅以块为单位保存文件大小。如果数据小于块,问题就会蔓延到用户空间,并出现填充字节或其他无意义的情况。
答案2
不必要。 shell解释器使用一些(或多或少复杂的)系统调用包装器(例如)来读取带有脚本的文件,read()
并且fread()
当它到达文件的最后一个字节时,它将发出文件结束条件的信号(这不需要为零)。