每个脚本的末尾是否都有一个“\0”?

Joe*_*oey 7 shell shell-script

我想知道你是如何确定脚本/文件的结尾的? 我对旧的 Unix 版本(如 V6)特别感兴趣。

最后一个写入的字符后是否有“\0”?

Bru*_*ger 12

更旧的 Unix 下的用户空间程序在文件末尾看不到“填充”字节。我知道 MS-DOS 或 CP/M 会用 Ctrl-Z 字符填充磁盘块,因此文件读取算法不仅必须检查磁盘块末尾,还必须检查填充字节。

Unix 从来没有做过那种事情。程序读取字节直到文件结束条件发生,这对于read(2)系统调用意味着返回 0。不幸的是,长时间运行的系统调用可能会被中断,这会导致read()返回错误代码 (-1),并且全局符号errno计算到 EINTR,所以 Unix 传统上也会在读取某些设备时引入一些愚蠢的行为。

这还有一个文件系统方面:Unix 文件系统会将数据放入磁盘块中,并在 inode 中保留一个文件大小以字节为单位的值。其他一些操作系统仅以块为单位保留文件大小。如果数据小于一个块,问题就会冒泡到用户空间,填充字节或其他废话。

  • CP/M 会用 Ctrl+Z 填充 128 字节的记录,但 DOS 从来没有这样做过——它总是像 Unix 一样记录确切的文件长度(尽管许多程序确实接受 ^Z 作为文件结束标记)。 (5认同)
  • @steveha:我怀疑“为 CP/M 编写然后移植”是解释(因为它适用于许多古老的奇怪的 DOS 东西:)) (3认同)