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

第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系统魅力逐渐开始“凸显”。

时间: 2024-11-08 21:33:35

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

《Linux/UNIX系统编程手册(上、下册)》——1.3 标准化

1.3 标准化 20世纪80年代末,可用的UNIX实现层出不穷,由此也带来了种种弊端.有些UNIX实现基于BSD,而另一些则基于System V,还有一些则是对两大"流派""兼容并蓄".更有甚者,每个厂商都在自己的UNIX实现中添加了额外特性.其结果是将软件及技术人员在不同UNIX实现间转移就变得异常困难.这一形式有力地推动了C语言和UNIX系统的标准化进程,使得应用程序能够在不同操作系统间很方便地进行移植.接下来,将介绍由此而产生的各种标准. 1.3.1 C编程语

《Linux/UNIX系统编程手册(上、下册)》——1.2 Linux简史

1.2 Linux简史 术语Linux通常用来指代完整的类UNIX(UNIX-like)操作系统,Linux内核只是其中的一部分.这么定义多少有些措辞不当,因为一般商业Linux发布版中所含的诸多关键组件实际上发源于另一项目,早在Linux问世前几年就已经启动了. 1.2.1 GNU项目 1984年,Richard Stallman之前一直供职于MIT的一位天赋异禀的程序员,开始着手创建一个"自由的(free)"UNIX实现.Stallman的观点属于道德层面,而对"free

《Linux/UNIX系统编程手册(上、下册)》——1.4 总结

1.4 总结 1969年,贝尔实验室(AT&T的一个部门)的Ken Thompson在Digital PDP-7小型机上首次实现了UNIX系统.对该操作系统而言,无论是理念还是其双关语的称谓都来源于早期的MULTICS系统.时至1973年,UNIX已经被移植到了PDP-11小型机上,并以C语言对其进行了重写,C编程语言是由贝尔实验室的Dennis Ritchie设计并实现的.因为法律禁止AT&T销售UNIX,于是,在象征性地收取了一定的费用之后,AT&T索性将UNIX系统散布进了大

《Linux/UNIX系统编程手册(上、下册)》——导读

前言 本书将描述Linux编程接口:由UNIX操作系统的开源实现--Linux所提供的系统调用.库函数以及其他底层接口.运行于Linux之上的每一个程序都会直接或间接地使用这些接口.这些接口允许应用程序去执行诸多任务:文件I/O.创建/删除文件和目录.创建新进程.执行程序.设置定时器.在同一台计算机上发起进程或线程间通信,以及为联网计算机间的进程建立通信等等.有时,人们也将这一系列的底层接口称为系统编程接口. 尽管本书着眼于Linux,但对于标准和可移植性问题也倍加关注.对于Linux所特有的技

LINUX C系统编程与PYTHON中的时间模块对比

今天看python时间模块time的时候发现和LINUX系统编程中的时间调用函数基本一样,以前刚好没有好好学习LINUX C编程的时间模块就对比进行了学习. 本文只是给出函数接口和使用方式,详细了解请参考LINUX main page和PYTHON help 本文不涉及asctime和ctime,并且C中涉及多线程编程注意选择可重入性函数 一.时间存在方式 其实不管是C还是PYTHON这里都包含3种时间不同存在的方式 日历时间:Epoch以来的秒及新纪元时间(1970年1月1日 00:00:00

求教各位看过linuxunix 系统编程手册的大神

问题描述 求教各位看过linuxunix 系统编程手册的大神 小弟使用centos 6.7系统,在编译书中程序时总是出现许多错误,编译前已将所有头文件移至/usr/include 中 解决方案 是不是环境变量没有配置好呀... 你echo $PATH看一下 解决方案二: 那该怎么配置才算正确呢 解决方案三: 看看usr/include在不在搜索路径中,用echo $PATH

Linux/UNIX和Window平台上安装Mysql_Mysql

所有平台的Mysql下载地址为:MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台.  一.Linux/UNIX上安装Mysql Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址: MySQL - MySQL服务器.你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器.MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器.MySQL-devel - 库和包含文件

如何在 Linux/Unix 系统中验证端口是否打开

在 Linux 或者类 Unix 中,我该如何检查某个端口是否被占用?我又该如何验证 Linux 服务器中有哪些端口处于监听状态? 验证哪些端口在服务器的网络接口上处于监听状态是非常重要的.你需要注意那些开放端口来检测网络入侵.除了网络入侵,为了排除故障,确认服务器上的某个端口是否被其他应用程序占用也是必要的.比方说,你可能会在同一个系统中安装了 Apache 和 Nginx 服务器,所以了解是 Apache 还是 Nginx 占用了 # 80/443 TCP 端口真的很重要.这篇快速教程会介绍

Linux C系统编程:信号与定时器的使用

#include <stdio.h> #include <signal.h> void do_alarm(int num); int main(void) { //注册一个定时器 if(signal(SIGALRM , do_alarm) == SIG_ERR) { perror("register alarm fail"); return -1; } //alarm ////3秒之后发送SIGALRM信号,但是一次性的 SIGALRM信号:定时器的信号 ala