Linux操作系统应用编程
上QQ阅读APP看书,第一时间看更新

1.1 引言

Linux 操作系统是一个功能强大的分时多用户操作系统,可以运行在智能终端、服务器和其他大型平台之上,如可在大型机和超级计算机上运行。截至2020年,世界上500个运行速度最快的超级计算机中90%以上运行Linux发行版或“变种”,其中运行速度最快的前10名超级计算机运行的操作系统都是 Linux 操作系统。Linux 操作系统广泛应用在嵌入式设备上,如智能手机、路由器、电视机和电子游戏机等。在移动设备上广泛使用的Android操作系统就是创建在Linux内核之上的。因此,对计算机相关从业人员而言,学好Linux操作系统尤为重要。

1.1.1 什么是Linux

Linux 是一个可以免费使用和自由传播的类 UNIX 操作系统,也是一个基于 POSIX 和UNIX的支持多用户、多任务、多线程和多CPU的操作系统。Linux操作系统继承了UNIX操作系统以网络为核心的设计思想,是一个性能稳定的网络操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议,支持32位和64位硬件。

Linux操作系统诞生于1991年10月5日。Linux操作系统存在着许多不同的版本,但它们都使用了Linux内核。严格来讲,“Linux”这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。GNU 工程,也称为自由软件工程项目或 GNU 计划,是由理查德·斯托曼(Richard Stallman)在1983年9月27日公开发起的,它的目标是创建一套完全自由的操作系统。

1.1.2 Linux的发展历程

Linux操作系统的诞生、发展和成长过程始终依赖5个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet。

1984年,安德鲁·S·特南鲍姆(Andrew S.Tanenbaum)开发了用于教学的UNIX系统,命名为MINIX。

1989年,安德鲁·S·特南鲍姆将MINIX操作系统运行于x86的PC平台。

1990 年,芬兰赫尔辛基大学学生莱纳斯·托瓦尔兹(Linus Torvalds)首次接触 MINIX操作系统。

1991年,莱纳斯·托瓦尔兹开始在MINIX操作系统上编写各种驱动程序等操作系统内核组件。

1991年年底,莱纳斯·托瓦尔兹公开了Linux内核源代码0.02版,此版本仅仅是部分代码。

1993年,Linux 1.0发行,Linux操作系统转向采用GPL协议。

1994年,Linux操作系统的第一个商业发行版Slackware问世。

1996年,美国国家标准技术局的计算机系统实验室确认Linux 1.2.13符合POSIX标准。

1998 年,埃里克·雷蒙德(Eric Raymond)等人创办了“开放源代码促进会”,在互联网世界里展开了一场历史性的Linux产业化运动。

1999年,Linux操作系统的简体中文发行版问世。

2001年,美国NAS(美国国家安全局)发布了SELinux。SELinux提供了标准UNIX权限管理系统以外的另一层安全检查。

2004年,Ubuntu带着不同寻常的版本号4.10和怪异的版本代号“Warty Warthog”问世。Ubuntu不是内核的主要贡献者,但它对Linux在PC上的普及起到了重要的作用。

2007年,Linux基金会由开源发展实验室(OSDL)和自由标准组织(FSG)联合成立。

2011年,Linux 3.0版本发布。

此后Linux操作系统日趋成熟,涌现出大量基于Linux操作系统的应用,并且广泛应用于基于ARM技术的嵌入式系统中。

1.1.3 Linux操作系统的组成

Linux 操作系统一般有四大主要部分:内核、Shell、文件系统和应用程序。内核、Shell和文件系统一起构成了基本的操作系统,它们使用户可以运行程序、管理文件并使用系统。

1.Linux内核

内核是操作系统的核心,它提供了操作系统最基本的功能,如支持虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络等。Linux内核的模块分为以下部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。

Linux内核在内存和CPU使用方面具有较高的效率,并且非常稳定,同时具有良好的可移植性。Linux 内核编译后可在不同处理器和具有不同体系结构约束与需求的平台上运行。一个典型的例子是:Linux内核可以在一个具有内存管理单元(Memory Management Unit, MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。

2.Linux Shell

Shell 是 Linux 操作系统的一种用户界面,它作为操作系统的“外壳”,为用户提供使用操作系统的接口。如果把Linux内核想象成一个球体的中心,那么Shell就是围绕内核的外层。当从Shell或其他程序向Linux内核传递命令时,Linux内核会做出相应的反应。总结起来,Shell主要有以下两大功能特点。

(1)Shell是一个命令解释器,它拥有自己内建的Shell命令集。Shell也能被系统中其他应用程序所调用。用户在命令提示符下输入的命令都由Shell先解释然后传给Linux内核。

有一些命令,比如改变工作目录命令(cd),是包含在Shell内部的。还有一些命令,比如复制命令(cp)和移动命令(mv),是存在于文件系统中某个目录下的单独的应用程序。对用户而言,不必关心一个命令是包含在Shell内部还是一个单独的应用程序。

Shell首先检查命令是否是内部命令,若不是,再检查它是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm;也可以是购买的商业程序,如xv;还可以是自由软件,如Emacs)。然后Shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果输入的命令不是一个内部命令,并且在搜索路径里没有找到这个应用程序,将会显示一条错误信息;如果能够成功找到应用程序,该应用程序将被解析为系统调用并传给Linux内核。

(2)Shell的另一个重要特性是它自身就是一种解释型的程序设计语言。Shell编程语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单易学,任何在命令提示符中能输入的命令都能放到一个可执行的 Shell 程序中。

当用户成功登录Linux系统后,系统将执行一个Shell程序。正是Shell进程提供了命令提示符。作为默认值,Shell对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。

一旦出现Shell的命令提示符,用户就可以输入命令名称及命令所需要的参数。Shell将执行这些命令。如果一条命令花费了很长的时间来执行,或者在屏幕上显示了大量的输出,用户可以按Ctrl+C键发出中断信号来中断这条命令(在正常结束之前,中止它的执行)。

当用户准备结束登录对话进程时,可以输入logout命令、exit命令或按Ctrl+D键输入文件结束符(End of File,EOF),结束登录。

同Linux本身一样,Shell也有多种不同的版本。主要有下列版本的Shell。

① Bourne Shell:由AT&T公司开发。

② Bash:Bourne Again Shell,是GNU操作系统上默认的Shell。

③ Korn Shell:是对Bourne Shell的发展,在大部分情况下与Bourne Shell兼容。

④ C Shell:由SUN公司推出,语法类似C语言。

⑤ Z Shell:Z是26个英文字母的最后一个字母,Z Shell也就是终极Shell。它集成了Bash、Korn Shell的重要特性,同时又增加了自己独有的特性。

3.Linux文件系统

文件系统是文件存放在磁盘等存储设备上的组织方法。Linux 操作系统能支持多种目前流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO 9660。

Linux 文件系统中的文件是数据的集合,文件系统不仅包含文件中的数据,而且包含文件系统的结构,大多数与Linux用户和程序相关的文件、目录、软连接及文件保护信息等都存储在其中。

在Linux文件系统中,EXT2文件系统、虚拟文件系统、/proc文件系统是3个具有代表性的文件系统。文件类型主要包括:普通文件(regular file)、目录文件(directory)、连接文件(link)、设备与设备文件(device)、套接字(socket)、管道(pipe)。

Linux最早的文件系统是MINIX,但是专门为Linux设计的文件系统——扩展文件系统第二版(EXT2)被添加到Linux后,对Linux产生了重大影响。EXT2文件系统功能强大、易扩充,性能上进行了全面优化,是目前所有Linux发布和安装的标准文件系统类型。

每个实际文件系统都是从操作系统和系统服务中分离出来的,它们之间通过一个接口层——虚拟文件系统(Vitual File System,VFS)通信。VFS使Linux可以支持多个不同的文件系统,每个文件系统表示一个VFS的通用接口。VFS将Linux文件系统的所有细节进行了转换,因此Linux内核的其他部分及系统中运行的程序将看到统一的文件系统。Linux的VFS允许用户同时透明地安装许多不同的文件系统。

在 Linux 文件系统中,作为一种特殊类型,/proc 文件系统只存在内存中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc 文件系统是一个伪文件系统,用户和应用程序可以通过/proc 得到系统的信息,并可以改变内核的某些参数。

4.Linux应用程序

标准的Linux操作系统一般都有一套称为应用程序的程序集,它包括编辑器、编程语言、X Window、办公套件、Internet工具和数据库等。类似于Windows文本编译器、IE等。

1.1.4 Linux操作系统的版本

Linux操作系统主要分为内核版本以及发行版,其具体内容如下。

1.Linux操作系统的内核版本

Linux内核使用主要分为两种不同的版本编号方式。

(1)第一种方式用于1.0之前版本(包括1.0)。第一个版本号是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。

(2)第二种方式用于1.0之后版本到2.6版本,数字由3部分(A.B.C)组成,A为主版本号,B为次版本号,C为末版本号。只有在内核发生很大变化时(历史上只发生过两次, 1994年的1.0和1996年的2.0),A才变化。可以通过B来判断Linux操作系统是否稳定,B为偶数代表稳定版,B为奇数代表测试版。C代表bug修复、安全更新、新特性和驱动的更新次数。以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表末版本号。

2.Linux操作系统的发行版

一些组织或厂家将Linux操作系统的内核与外围实用程序(Utilities)和文档包装起来,并提供一些系统安装界面和系统配置、设定与管理工具,这样就构成了一种发行版。

Linux 操作系统发行版实际就是 Linux 内核加上外围实用程序组成的一个大软件包。相对于Linux操作系统的内核版本,发行版的版本号随发布者的不同而不同,与Linux操作系统内核的版本号是相对独立的。因此把SUSE、RedHat、Ubuntu、Slackware等直接称为Linux是不确切的,它们是Linux操作系统的发行版。更确切地说,应该将它们称为“以Linux为核心的操作系统软件包”。根据GPL准则,这些发行版虽然都源自一个内核,并且都有各自的贡献,但都没有自己的版权。Linux 操作系统的各个发行版都是使用莱纳斯·托瓦尔兹主导开发并发布的同一个Linux内核,因此在内核层不存在兼容性问题。每个版本不一样的地方只是在发行版的最外层才有所体现,而绝不是在于Linux本身,特别是不存在内核不统一或是不兼容。

20世纪90年代初期,Linux开始出现的时候,仅仅是以源代码形式出现的,用户需要在其他操作系统下进行编译才能使用。后来出现了一些正式版本,目前流行的几个正式版本有SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo 等。用户可根据自己的经验和喜好选用合适的Linux发行版。本书使用的是Linux CentOS 7版本。

早期,莱纳斯·托瓦尔兹将Linux置于一个禁止任何商业行为的条例之下,但之后改用 GNU 通用公共许可证第二版。该协议允许任何人对软件进行修改或发行,包括商业行为(只要其遵守该协议),所有基于 Linux 的软件也必须以该协议的形式发表,并提供源代码。