1.1 UNIX、Linux和GNU简介

近年来,Linux已成为一种现象。几乎每天,Linux都以某种方式出现在媒体上。我们已经数不清在Linux上有多少应用程序以及有多少机构(包括一些政府部门和城市管理部门)在使用Linux了。主要的硬件厂商(如IBM和Dell)现在都已支持Linux,主要的软件厂商(如Oracle)也都已支持他们的软件运行在Linux之上。Linux已真正成为一个切实可行的操作系统,特别是在服务器市场中。

Linux的成功要归功于在它之前诞生的系统和应用程序——UNIX和GNU软件。本节将介绍Linux是怎样产生的,以及它植根于何处。

1.1.1 什么是UNIX

UNIX操作系统最初是由贝尔实验室开发的,当时的贝尔实验室是电信业巨头AT&T(美国电报电话公司)旗下的一员。UNIX是在20世纪70年代为DEC(数字设备公司)的PDP系列计算机设计的,它现在已成为一种非常流行的多用户、多任务操作系统。UNIX操作系统可以运行在大量不同种类的硬件平台上,其适用范围从PC工作站一直到多处理器服务器和超级计算机。

1.UNIX简史

严格来说,UNIX是由Open Group(开放组织)管理的一个商标,它指的是一种遵循特定规范的计算机操作系统。这个规范也称为单一UNIX规范(The Single UNIX Specification),它定义了所有必需的UNIX操作系统函数的名称、接口和行为。这个规范在很大程度上是早期由IEEE(电气和电子工程师协会)开发的P1003或POSIX规范的超集。

许多类UNIX系统都是具有商业性质的,如IBM的AIX、HP的HP-UX和Sun的Solaris。还有一些可以免费获得,如FreeBSD和Linux。如今只有少数系统完全遵守开放组织的规范,从而允许它们挂上“UNIX”的商标。

在过去,不同UNIX系统之间的兼容性一直是一个实际存在的问题,尽管POSIX规范在这一方面起了很大的帮助。现在,通过遵守一些简单的规则,创建可以运行在所有UNIX和类UNIX系统上的应用程序已成为可能。关于Linux和UNIX标准的更多细节内容可以在本书的第18章中找到。

2.UNIX哲学

在后续的章节里,我们希望能够向读者传达一种Linux(UNIX)程序设计的风格。虽然不管在哪种平台上用C语言编程在很多方面都是一样的,但UNIX和Linux开发者对编程和系统开发确实有其独特的观点。

UNIX操作系统(包括Linux)鼓励一种特定的编程风格。下面列出了一些典型的UNIX程序和系统所具有的特点。

简单性:许多很有用的UNIX工具是非常简单的,因此也是很小并易于理解的。“小而简单”(KISS:Keep It Small and Simple)是一种值得学习的技术。越大、越复杂的系统注定包含越大、越复杂的错误,而调试是我们所有人都想避免的苦差事。

集中性:通常,让一个程序很好地执行一项任务要好过把所有功能都乱七八糟地堆在一起。功能臃肿的程序难于使用和维护,只有单一目标的程序更容易随着更好的算法或界面被开发出来而得到改进。在UNIX中,当用户出现新的需求时,我们通常是把小工具组合起来以完成更复杂的任务,而不是试图将一个用户期望的所有功能放在一个大程序里。

可重用组件:将应用程序的核心实现为库。具有简单而灵活的编程接口、文档齐备的库可以帮助其他人开发出同类程序,或者把这些技术应用到新的应用领域。dbm库就是一个例子,它是一组可重用的函数,而不是单一的数据库管理程序。

过滤器:许多UNIX应用程序可用作过滤器。也就是说,它们对输入进行转换并产生输出。正如你将在后面看到的,UNIX提供了一些机制,让我们可以把一些UNIX程序通过一种新颖的方式组合起来,以开发出相当复杂的应用程序。当然,这种类型的重用是靠我们前面提到的开发方法支撑的。

开放的文件格式:比较成功并流行的UNIX程序都使用纯ASCII码的文本文件或XML文件作为配置文件和数据文件。如果你在开发程序时采用了任一种做法,那你做对了!它使用户可以用标准工具来修改和搜索配置项,并且可以开发出新工具在数据文件上执行新的功能。ctags源代码交叉引用系统就是一个好例子,它把符号位置信息以适合于搜索程序使用的正则表达式的形式记录下来。

灵活性:你不能期待用户都能非常正确地使用你的程序。所以,你在编程时应尽量考虑到灵活性,尽量避免随意限制字段长度或记录数目。如果你能做到的话,则你编写的网络程序既能在单机上运行,也能跨网络运行。永远不要认为你知道用户想做的一切事。

1.1.2 什么是Linux

可能你已经知道,Linux是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。因为Linux以UNIX系统为其灵感来源,所以Linux程序和UNIX程序是非常相似的。事实上,几乎所有为UNIX编写的程序都可以在Linux上编译运行。而且,一些专用于UNIX商业版本的商业应用软件,也可以不加改变地以二进制形式运行在Linux系统上。

Linux是由赫尔辛基大学的Linus Torvalds开发的,期间得到了因特网上广大UNIX程序员的帮助。它最初只是受Andy Tanenbaum教授的Minix(一个小型的类UNIX系统)启发而开发的程序,纯属个人爱好,但后来它自身逐步发展成为一个完整的系统。其开发目的是保证Linux除包含可以自由发布的代码外,不会集成任何专有代码。

现在,使用不同类型CPU的计算机系统都有Linux的版本可以运行其上,包括基于32位和64位Intel x86及其兼容处理器的个人计算机、使用SUN SPARC、IBM PowerPC、AMD Opteron、Intel Itanium的工作站和服务器,甚至一些手持PDA和Sony PS2/PS3游戏机。只要这个设备有处理器,就会有人试图让Linux运行其上。

1.1.3 GNU项目和自由软件基金会

Linux能够存在并发展到今天是无数人共同努力的结果。操作系统内核本身仅仅是可用开发系统的一小部分。传统上,商业化的UNIX系统都包含提供系统服务和工具的应用程序。对Linux系统来说,这些额外的程序是由许多程序员编写并自由发布的。

Linux社区(以及其他的软件开发组织)支持自由软件的概念,即软件本身不应受限,它们应遵守GNU(GNU是GNU's Not UNIX的递归缩写)通用公共许可证(GPL)。虽然获得软件可能要支付一定的费用,但此后就可以随意使用它们,并且它们通常是以源代码的形式发布。

自由软件基金会(Free Software Foundation)由Richard Stallman创立,他是UNIX及其他系统上最著名的文本编辑软件之一GNU Emacs的开发者。Stallman是自由软件这一概念的倡导者,并发起了GNU项目,这个项目的宗旨是:试图创建一个与UNIX系统兼容,但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。可能有一天,GNU处理硬件和管理运行程序的方式会变得与UNIX完全不同,但它仍然会继续支持UNIX类型的应用程序。

GNU项目已为软件社区提供了许多UNIX系统上应用程序的仿制品。所有这些程序,即GNU软件,都是在GNU通用公共许可证(GPL)的条款下发布的。你可以在http://www.gnu.org上找到该许可证的一份副本。这份许可证阐述了copyleft(copyleft是一个生造的词,是英文copyright的反话)的概念。copyleft的目的是防止有人给自由软件的使用加上限制。

下面是在GPL条款下发布的一些主要的GNU项目软件。

❑ GCC:GNU编译器集,它包括GNU C编译器。

❑ G++:C++编译器,是GCC的一部分。

❑ GDB:源代码级的调试器。

❑ GNU make:UNIX make命令的免费版本。

❑ Bison:与UNIX yacc兼容的语法分析程序生成器。

❑ bash:命令解释器(shell)。

❑ GNU Emacs:文本编辑器及环境。

许多其他的软件包也是在遵守自由软件的原则和GPL条款的情况下开发和发行的,包括电子表格、源代码控制工具、编译器和解释器、因特网工具、图形图像处理工具(如Gimp),以及两个完整的基于对象的环境(GNOME和KDE)。我们将在第16章和第17章讨论GNOME和KDE。

现在有这么多可用的自由软件,再加上Linux内核,我们可以说:创建一个GNU的、自由的类UNIX系统的目标已经通过Linux系统实现了。由于认识到GNU软件所做出的贡献,现在许多人通常都把Linux系统称为GNU/Linux。

你可以在http://www.gnu.org上找到更多关于自由软件的概念。

1.1.4 Linux发行版

正如我们前面提到的,Linux实际上只是一个内核。你可以获得内核源代码,编译并安装它,然后获得并安装许多其他自由发布的软件,从而完成一个完整Linux系统的安装。我们通常将这样安装所得的系统称为Linux系统,这是因为它包含的远不止一个Linux内核。系统中大多数的工具都来自于自由软件基金会的GNU项目。

你可能会意识到,仅从源代码开始创建Linux系统是一件很不容易的事。幸运的是,许多人制作了准备好安装的Linux发行版(通常称为flavor),它一般可下载或以CD-ROM/DVD为载体。它不仅包含内核,还包含许多其他编程工具和应用程序。它通常都会包含一个X视窗系统的实现,即在许多UNIX系统上都有的一个图形化环境。Linux发行版通常还带有安装程序和附加文档(这些一般也都在CD上),帮助你安装自己的Linux系统。一些著名的Linux发行版(特别是在Intel x86系列处理器上的发行版)有Red Hat Enterprise Linux及其社区开发版的Fedora、Novell SuSE Linux及其免费的openSUSE变体、Ubuntu Linux、Slackware、Gentoo和Debian GNU/Linux,更多Linux发行版的详细信息可访问DistroWatch网站http://distrowatch.com