《Linux/UNIX系统编程手册(上、下册)》——第1章 历史和标准 1.1UNIX和C语言简史

简介: 这一渊源使UNIX集多种开创性的特性于一身,但同时也带来了负面影响——随着时间的推移,UNIX的实现渐趋分裂。因此,要编写出能够运行于所有UNIX实现之上的应用程序愈发困难。这又导致了人们对UNIX实现的标准化呼声越来越高,本章的第二部分将讨论这一问题。

本节书摘来自异步社区《Linux/UNIX系统编程手册(上、下册)》一书中的第1章,第1.1节,作者:【德】Michael Kerrisk著,更多章节内容可以访问云栖社区“异步社区”公众号查看

第1章 历史和标准

Linux是UNIX操作系统家族中的一员。就计算机的发展而言,UNIX历史悠久。本章的第一部分会简要介绍UNIX的历史——以对UNIX系统和C编程语言起源的回顾拉开序幕,接着会述及成就今日Linux系统的两大关键因素:GNU项目和Linux内核的开发。

UNIX系统最引人关注的特征之一,是其开发不受控于某一厂商或组织。相反,许多团体——既有商业团体,也有非商业团体——都曾为UNIX的演进做出过贡献。这一渊源使UNIX集多种开创性的特性于一身,但同时也带来了负面影响——随着时间的推移,UNIX的实现渐趋分裂。因此,要编写出能够运行于所有UNIX实现之上的应用程序愈发困难。这又导致了人们对UNIX实现的标准化呼声越来越高,本章的第二部分将讨论这一问题。

对UNIX的定义通常有两种。其一是指通过SUS所规范的官方一致性测试,且由OPEN GROUP(UNIX商标的持有者)正式授权冠以“UNIX”的操作系统。在写作本书之际,尚无开源的UNIX实现(比如,Linux和FreeBSD)获得了“UNIX”冠名。

在第二种定义中,UNIX是指那种运作方式类似于经典UNIX系统(比如,最初的Bell实验室UNIX系统,及其后来的主要分支System V和BSD)的操作系统。根据这一定义,一般将Linux视为UNIX系统(如同现代BSD系统一样)。尽管本书会密切关注SUS,但也会遵循对UNIX的第二种定义,因此诸如“Linux,像其他UNIX实现一样……”这样的说法,会在书中频繁出现。

1.1 UNIX和C语言简史

1969年,在AT&T电话公司下辖的bell实验室中,Ken Thompson开发出了首个UNIX实现。该实现是使用Digital PDP-7小型机的汇编语言开发而成的。其名称UNIX是“MULTICS(多信息及计算服务,Multiplexed Information and Computing Service)”一词的双关语,而MULTICS之名则出自一个早期的操作系统开发项目,该项目由AT&T、MIT(麻省理工学院)以及通用电器公司联合开发。(因为未能开发出一款经济实用的操作系统,该项目首战失利。沮丧之余,AT&T随即退出这一项目中。)Thompson设计新操作系统的某些灵感正源于MULTICS,其中包括:树形结构的文件系统、设立单独的程序用于解释命令(shell),以及将文件作为无结构字节流看待的概念。

1970年,AT&T的工程师们又在刚购进的Digital PDP-11小型机上,以汇编语言重写了UNIX,当时,Digital PDP-11算得上是最新颖、功能也最为强劲的计算机了。从大多数UNIX实现(包括Linux)沿用至今的各种名称上,仍能发现这一PDP-11实现所残留的历史遗迹。

未过多久,Dennis Ritchie(Thompson在bell实验室的同事,UNIX开发的早期合作者)设计并实现出了C编程语言。这里有一个演变过程:C语言传承自早期的解释型语言——B语言;B语言最初由Thompson实现,但其所包含的许多理念却来自于更早期的编程语言——BCPL。到了1973年,C语言步入了成熟期,人们能够使用这一新语言重写几乎整个UNIX内核。UNIX因此也一变而为最早以高级语言开发而成的操作系统之一,这也促成了UNIX系统后续向其他硬件架构的移植。

从C语言的起源不难看出为什么C语言及其“后裔”C++是当今使用最为广泛的系统编程语言。早期流行的编程语言其设计初衷并不在于此,例如:FORTRAN语言意在帮助工程师和科研工作者们进行数学计算,COBOL语言则是在商业系统中用来处理面向记录的数据流。C语言的出现,填补了当时系统编程方面的语言空白。与FORTRAN和COBOL不同(这两种编程语言均由大型组织设计开发),C语言的设计理念和设计需求出自于几位程序员的构思,他们的目标很单纯:为实现UNIX内核及其相关软件而开发一种高层语言。像UNIX操作系统本身一样,C语言由专业程序员设计而为己用。其最终结果堪称完美:C语言的设计前后连贯,且支持模块化设计,成为短小精干、高效实用、功能强大的编程语言。

UNIX的第一版到第六版
1969~1979年间,UNIX历经了多次发布,也称为版本(edition)。实质上,这些发布是AT&T对UNIX进行演进开发时的一系列版本快照。[Salus,1994]记录了UNIX前六版的发布日期如下。

  • 1971年11月发布的第一版:当时,UNIX还运行在PDP-11上,但已附带了FORTRAN编译器,许多被沿用至今的程序都已有了雏形,这包括:ar、cat、chmod、chown、cp、dc、ed、find、ln、ls、mail、mkdir、mv、rm、sh、su以及who。
  • 1972年6月发布的第二版:当时,AT&T内有10台计算机安装了UNIX。
  • 1973年2月发布的第三版:该版本包括了C编译器,以及管道的首个实现。
  • 1973年11月发布的第四版:这也是几乎完全以C语言重写的首个UNIX版本。
  • 1974年6月发布的第五版:当时,UNIX的装机数已经超过了50台。
  • 1975年3月发布的第六版:这也是在AT&T之外广泛使用的首个UNIX版本。

在此期间,UNIX使用范围从AT&T自内而外逐步扩展,声名也随之远播。读者甚众的《ACM通信》杂志刊载了一篇关于UNIX的论文([Ritchie & Thompson, 1974]),这对UNIX知名度的提升功莫大焉。

当时,在美国政府的授权下,AT&T垄断着全美电信市场。AT&T与美国政府达成的协议条款禁止AT&T涉足软件销售行业——这意味着,AT&T不能将UNIX作为产品销售。相反,从1974年的UNIX第五版开始,AT&T准许高校在支付象征性的发布费用后使用UNIX系统——这一现象尤以第六版为烈。UNIX系统的高校发布版包括了相关文档及内核源码(当时,内核源码约为10 000行左右)。

AT&T对高校发布的UNIX极大促进了这一操作系统的普及和使用。时至1977年,UNIX已经在约 500 个站点中运行,其中包括了全美及其他国家的 125 所大学。当时的商业操作系统非常昂贵,UNIX则为高校提供了一种交互式多用户操作系统,可谓物美价廉。此外,各校的计算机系还籍此获得了“鲜活”的操作系统源码,可以对源码进行修改,还可供学生们学习、实验之用。一些以UNIX知识为武装的学生后来成为UNIX“传教士”。另外一些学生则组建或加盟了大量新兴公司,其业务主要是销售廉价的计算机工作站,而运行于其上的正是易于移植的UNIX操作系统。

BSD和System V的诞生
发布于1979年1月的UNIX第七版改善了系统的可靠性,配备了增强型的文件系统。该版本还附带了不少新的工具软件,其中包括:awk、make、sed、tar、uucp、Bourne shell以及FORTRAN 77编译器。第七版UNIX发布的重要意义还在于,从该版本起,UNIX分裂为了两大分支:BSD和System V。接下来会简要描述二者的由来。

受母校加州大学伯克利分校之邀,Thompson于1975/1976学年曾担任该校的客座教授。在此期间,他与研究生们一起为UNIX开发了许多新特性。(他的学生之一,Bill Joy,后来与人共同组建了SUN微系统公司——一家最早涉足UNIX工作站市场的公司。)光阴荏苒,许多UNIX的新工具和新特性又陆续在伯克利分校问世,这包括:C shell、vi编辑器、一种改进型的文件系统(伯克利快速文件系统)、sendmail、Pascal语言编译器,以及用于新型Digital VAX架构的虚拟内存管理机制。

这一命名为BSD(伯克利软件发布,Berkeley Software Distribution)的UNIX版本(包括源码在内)分发颇广。1979年12月,诞生了首个完整的UNIX发布版3BSD。(之前发布的Berkeley-BSD和2BSD并非完整的UNIX发布版,仅含由伯克利分校开发的新工具。)

1983年,加州大学伯克利分校的计算机系统研究组(Computer Systems Research Group)发布了4.2BSD。该版本的发布意义深远,因为其包含了完整的TCP/IP实现,其中包括套接字应用编程接口(API)以及各种网络工具。4.2BSD及其前身4.1BSD在世界上多所大学开始广为流传。以这两者为基础,还形成了SunOS操作系统(首发于1983年)——这一由SUN公司销售的UNIX变种。其他重要的BSD版本还有发布于1986年的4.3BSD,以及发布于1993年的最终版本4.4BSD。

首批UNIX向非PDP-11硬件机型的移植发生在1977年和1978年,当时,Dennis Ritchie和Steve Johnson将UNIX移植到了Interdata 8/32上,与此同时,澳大利亚Wollongong大学的Richard Miller也将其移植到了Interdata 7/32上。伯克利分校针对Digital Vax架构的移植——也称为32V,则基于John Reiser和Tom Lodon较早前(1978年)的工作成果。该移植本质上与PDP-11上的UNIX第七版相同,只是支持的地址空间更大、数据类型更宽罢了。
与此同时,美国的反托拉斯法案强制对 AT&T 进行拆分(于20世纪70年代中期开始立案,到1982年AT&T正式解体)。随着其在电话系统市场垄断地位的丧失,AT&T 也因而获准销售UNIX。这也催生了1981年System III(3)的发布。System III由AT&T所属的UNIX支撑团队(UNIX Support Group,USG)研发,该团队雇佣了数以百计的研发人员来从事UNIX系统的增强以及应用开发(尤其针对文档预备软件包和软件开发工具)。1983年,System V的首个发布版又接踵而至,在经过一系列发布后,USG最终于1989年推出了System V Release 4(SVR4),此时的System V纳入了BSD的诸多特性,包含联网能力。AT&T将System V授权给不同厂商,这些厂商又将其作为自身UNIX实现的基础。

因此,除了遍布于学术界的各种BSD发布版外,到20世纪80年代末,商业性质的UNIX实现在各种硬件架构上都有了广泛应用。这包括:SUN公司的SunOS,以及后来的Solaris;Digital公司的Ultrix和OSF/1(在历经一系列更名和收购后,现称为HP Tru64 UNIX);IBM公司的AIX;HP公司的HP-UX;NeXT公司的NeXTStep;在Apple Macintosh机上的A/UX;以及Microsoft和SCO公司联合为Intel x86-32架构开发的XENIX。(贯穿本书,我们将x86-32架构上的Linux实现称为Linux/x86-32。)这一局面与当时典型的专有硬件搭配专有操作系统的模式形成了鲜明对照,那时,每个厂商只生产一种或至多几种专有的计算机芯片架构,然后再销售运行于该硬件架构之上的专有操作系统。大多数厂商系统的这种专有性,意味着消费者只能在一棵树上“吊死”。转换到另一专有操作系统和硬件平台,其代价十分高昂,不但需要移植现有应用,还需要对操作人员进行重新培训。从商业角度来看,考虑到上述因素,加之各厂商纷纷推出了廉价的单用户UNIX工作站,具备可移植性的UNIX系统魅力逐渐开始“凸显”。

相关文章
|
1月前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
1月前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
205 0
|
1月前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
34 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
1月前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
39 0
|
1月前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
45 0
|
1天前
|
消息中间件 关系型数据库 MySQL
Linux:开源之魅与编程之道
Linux:开源之魅与编程之道
9 1
|
19天前
|
Linux 开发者
Linux文件编程(open read write close函数)
通过这些函数,开发者可以在Linux环境下进行文件的读取、写入和管理。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
85 4
|
24天前
|
传感器 Linux API
嵌入式Linux串口编程简介
嵌入式Linux串口编程简介
19 1
|
25天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作