预计阅读本页时间:-
4.1.3 文件类型
很多操作系统支持多种文件类型。如UNIX和Windows中都有普通文件和目录,UNIX还有字符特殊文件(character special file)和块特殊文件(block special file)。普通文件(regular file)中包含有用户信息。图4-2中的所有文件都是普通文件。目录(directory)是管理文件系统结构的系统文件,将在以后的章节中讨论。字符特殊文件和输入/输出有关,用于串行I/O类设备,如终端、打印机、网络等。块特殊文件用于磁盘类设备。本章主要讨论普通文件。
普通文件一般分为ASCII文件和二进制文件。ASCII文件由多行正文组成。在某些系统中,每行用回车符结束,其他系统则用换行符结束。有些系统还同时采用回车符和换行符(如MS-DOS)。文件中各行的长度不一定相同。
ASCII文件的最大优势是可以显示和打印,还可以用任何文本编辑器进行编辑。再者,如果很多程序都以ASCII文件作为输入和输出,就很容易把一个程序的输出作为另一个程序的输入,如shell管道一样。(用管道实现进程间通信并非更容易,但若以一种公认的标准(如ASCII码)来表示,则更易于理解一些。)
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
其他与ASCII文件不同的是二进制文件。打印出来的二进制文件是无法理解的、充满混乱字符的一张表。通常,二进制文件有一定的内部结构,使用该文件的程序才了解这种结构。
如图4-3a是一个简单的可执行二进制文件,它取自某个版本的UNIX。尽管这个文件只是一个字节序列,但只有文件的格式正确时,操作系统才会执行这个文件。这个文件有五个段:文件头、正文、数据、重定位位及符号表。文件头以所谓的魔数(magic number)开始,表明该文件是一个可执行的文件(防止非这种格式的文件偶然运行)。魔数后面是文件中各段的长度、执行的起始地址和一些标志位。程序本身的正文和数据在文件头后面。这些被装入内存,并使用重定位位重新定位。符号表则用于调试。

二进制文件的第二个例子是UNIX的存档文件,它由已编译但没有连接的库过程(模块)集合而成。每个文件以模块头开始,其中记录了名称、创建日期、所有者、保护码和文件大小。该模块头与可执行文件一样,也都是二进制数字,打印输出它们毫无意义。
所有操作系统必须能够识别它们自己的可执行文件的文件类型,其中有些操作系统还可识别更多的信息。一种老式的TOPS-20操作系统(用于DECsystem20计算机)甚至可检查可执行文件的创建时间,然后,它可以找到相应的源文件,看它在二进制文件生成后是否被修改过。如果修改过,操作系统自动重新编译这个文件。在UNIX中,就是在shell中嵌入make程序。这时操作系统要求用户必须采用固定的文件扩展名,从而确定哪个源程序生成哪个二进制文件。
如果用户执行了系统设计者没有考虑到的某种操作,这种强制类型的文件有可能会引起麻烦。比如在一个系统中,程序输出文件的扩展名是.dat(数据文件),若用户写一个格式化程序,读入.c(C程序)文件并转换它(比如把该文件转换成标准的首行缩进),再把转换后的文件以.dat类型输出。如果用户试图用C编译器来编译这个文件,因为文件扩展名不对,C编译器会拒绝编译。若想把file.dat复制到file.c也不行,因为系统会认为这是无效的复制(防止用户错误)。
尽管对初学者而言,这类“保护”是有利的,但一些有经验的用户却感到很烦恼,因为他们要花很多精力来适应操作系统对合理和不合理操作的划分。