本节书摘来自异步社区《Linux 高级程序设计(第三版)》一书中的第1章,第1.1节,作者:杨宗德 , 吕光宏 , 刘雍著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章 Linux下C语言开发环境
Linux应用程序开发平台有别于Windows应用程序开发平台,因此在介绍具体编程内容之前,本书第1、2章主要介绍Linux操作系统下C语言程序的开发环境和开发工具。
本章主要介绍Linux下C语言开发环境,包括一些基本概念和基本编程环境。本章第1节主要对Linux操作系统及其相关术语进行了简要介绍。
本章第2节主要介绍Linux操作系统下编程基本概念以及如何获得Linux下的帮助文件,包括Linux操作系统下C语言库文件标准以及系统调用的基本概念。
本章第3节主要介绍Linux部分常用工具,包括文件打包工具、查找搜索工具,熟练使用这些命令或工具在编程时能够很好地提高效率。
本章第4节为读者展示了GNU编码规范和Linux内核编码规范。读者在学习Linux编程之前应养成良好的编码规范,这样不仅能增强代码的可读性,还能减少代码维护的工作量,提高代码的可扩展性。
1.1 Linux操作系统简介
Linux 高级程序设计(第三版)
1.1.1 Linux操作系统简介
UNIX操作系统于1969年由Ken Thompson在AT& T贝尔实验室的一台DEC PDP-7计算机上实现。后来Ken Thompson和Dennis Ritchie使用C语言对整个系统进行了再加工和编写,使得UNIX能够很容易地移植到其他硬件的计算机上。由于此时AT&T还没有把UNIX作为它的正式商品,因此研究人员只是在实验室内部使用并完善它。正是由于UNIX是被作为研究项目,其他科研机构和大学的计算机研究人员也希望能得到这个系统,以便进行自己的研究。AT&T采用分发许可证的方法,大学和研究机构仅仅需要很少的费用就能获得UNIX的源代码以进行研究。UNIX的源代码被散发到各个大学,一方面使得科研人员能够根据需要改进系统,或者将其移植到其他的硬件环境中去;另一方面培养了大量懂得UNIX使用和编程的学生,这使UNIX的使用更为普及。
到了20世纪70年代末,在UNIX发展到版本6之后,AT&T认识到了UNIX的价值,并成立了UNIX系统实验室(UNIX System Lab,USL)来继续发展UNIX。因此一方面AT&T继续发展内部使用的UNIX版本7,一方面由USL开发对外正式发行的UNIX版本,同时AT&T也宣布对UNIX产品拥有所有权。几乎在同时,加州大学伯克利分校计算机系统研究小组(CSRG)借助UNIX对操作系统进行了研究,他们对UNIX进行的改进相当多,增加了很多当时非常先进的特性,包括更好的内存管理、快速且健壮的文件系统等,大部分原有的源代码都被重写,很多其他的UNIX使用者,包括其他大学和商业机构,都希望能得到经CSRG改进的UNIX系统。因此CSRG的研究人员把他们的UNIX组成一个完整的UNIX系统──BSD UNIX(Berkeley Software Distribution)向外发行。
与此同时,AT&T的UNIX系统实验室也在不断改进他们的商用UNIX版本,直到他们吸收了BSD UNIX中已有的各种先进特性,并结合其本身的特点,推出了UNIX System V版本。从此以后,BSD UNIX和UNIX System V形成了当今UNIX的两大主流,现代的UNIX版本大部分都是这两个版本的衍生产品:IBM的AIX4.0、HP/UX11和SCO的UNIXWare等属于System V,而Minix、freeBSD、NetBSD、OpenBSD等属于BSD UNIX。
Linux由UNIX操作系统发展而来,它的内核由Linus Torvalds以及网络上组织松散的黑客队伍一起从零开始编写而成。Linux从一开始就决定自由扩散Linux(包括源代码),他把源代码发布在网上,随即就引起爱好者的注意,他们通过互联网也加入了Linux的内核开发工作。一大批高水平程序员的加入使Linux得到了迅猛发展。到1993年底,Linux 1.0终于诞生。Linux 1.0已经是一个功能完备的操作系统,其内核紧凑高效,可以充分发挥硬件的性能,在4MB内存的80386机器上也表现得非常好。
Linux加入GNU并遵循通用公共许可证(GPL),由于不排斥商家对自由软件进一步开发,故而使Linux开始了又一次飞跃,出现了很多Linux发行版,如Ubutu、Slackware、Redhat、TurboLinux、OpenLinux等十多种,而且还在增加;还有一些公司在Linux上开发商业软件或把其他UNIX平台的软件移植到Linux上来。如今很多IT界的大腕如IBM、Intel、Oracle、Infomix、Sysbase、Netscape、Novell等都宣布支持Linux。商家的加盟弥补了纯自由软件的不足,扫清了发展障碍,Linux得以迅速普及。
Linux操作系统具有以下特点。
Linux具备现代一切功能完整的UNIX系统所具备的全部特征,其中包括真正的多任务、虚拟内存、共享库、需求装载、优秀的内存管理以及TCP/IP网络支持等。
Linux的发行遵守GNU的通用公共许可证(GPL)。
在原代码级上兼容绝大部分的UNIX标准(如IEEE POSIX,System V,BSD),遵从POSIX规范。读者可以在网络上获得关于这一内容的更多信息。
1.1.2 GNU/Linux简介
GNU工程(GNU是“GNU's Not UNIX”首字母缩写语)开始于1984年,旨在发展一款类UNIX且为自由软件的完整操作系统:GNU系统。更精确地说,各种使用Linux作为内核的GNU操作系统应该被称为GNU/Linux系统。
GNU工程开发了大量用于UNIX的自由软件工具和类UNIX操作系统,例如Linux。虽然有许多组织和个人都对Linux的发展作出了帮助,但自由软件基金会依然是最大的单个贡献者。它不仅仅创造了绝大部分在Linux中使用的工具,还为Linux的存在提供了理论和社会基础。
为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都遵循无条件授权所有权利给任何人的协议条款─GNU通用公共许可证(GNU General Public License,GPL)。
1985年Richard Stallman创立的自由软件基金会(FSF,Free Software Foundation)为GNU计划提供了技术、法律以及财政支持。尽管GNU计划大部分时候是由个人自愿无偿贡献,但FSF有时还是会聘请程序员帮助编写。当GNU计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持。
到了1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs、C语言编译器GCC以及大部分UNIX系统的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。
1.1.3 相关术语介绍
1.POSIX及其重要地位
POSIX表示可移植操作系统接口(Portable Operating System Interface,缩写为POSIX是为了读音更像UNIX)。它由电气和电子工程师协会(Institute of Electrical and Electronics Engineers,简称为IEEE)开发,可以提高类UNIX环境下应用程序的可移植性。然而,POSIX并不局限于UNIX,许多其他的操作系统,例如DEC OpenVMS和Microsoft Windows NT,都支持POSIX标准,尤其是IEEE STD.1003.1-1990(1995年修订)和POSIX.1。POSIX.1给操作系统提供了源代码级别的C语言应用编程接口(API),例如读写文件read/write。POSIX.1已经被国际标准化组织(International Standards Organization,缩写为ISO)所接受,被命名为ISO/IEC9945-1:1990标准。虽然某些部分还处在开发过程中,但是POSIX现在已经发展成为一个庞大的标准族。
2.GNU和Linux的关系
GNU项目已经开发了许多高质量的编程工具,包括emacs编辑器、著名的GNU C和C++编译器(gcc和g++),这些编译器可以在任何计算机系统上运行。所有的GNU软件和派生工作均使用GNU通用公共许可证(GPL)。GPL允许软件作者拥有软件版权,但要授予其他任何人以合法复制、发行和修改软件的权利。
Linux中使用了许多GNU工具,用于实现POSIX.2标准的工具几乎都是GNU项目开发的。Linux内核、GNU工具以及其他的一些自由软件组成了人们常说的Linux,包括C语言编译器和其他开发工具及函数库、X Window窗口系统、各种应用软件(包括字处理软件、图像处理软件等)、其他各种Internet软件(包括FTP服务器、WWW服务器)、关系数据库管理系统等。
3.通用公共许可证(General Public License,GPL)
GPL的文本保存在Linux系统的不同目录中的COPYING文件里。例如,键入“cd/usr/ doc/ghostscript*”,然后再键入“more COPYING”可查看GPL的内容。GPL和软件是否免费无关,它的主要目标是保证软件对所有用户来说是自由的。GPL通过如下途径实现这一目标。
(1)要求软件以源代码的形式发布,并规定任何用户都能够以源代码的形式将软件复制或发布给其他用户。
(2)提醒每个用户,对于该软件不提供任何形式的担保。
(3)如果用户的软件使用了受GPL保护的软件的任何一部分,该软件都会成为GPL软件,也就是说必须随应用程序一起发布源代码。
(4)GPL并不排斥对自由软件进行商业性质的包装和发行,也不限制在自由软件的基础上打包发行其他非自由软件。
遵照GPL的软件并不是可以任意传播的,这些软件通常都有正式的版权,GPL在发布软件或者复制软件时都会声明限制条件。但是,从用户的角度考虑,这些根本不能算是限制条件,相反,用户只会从中受益,因为它可以确保用户获得源代码。
尽管Linux内核也属于GPL范畴,但GPL并不适用于通过系统调用而使用内核服务的应用程序,通常把这种应用程序看作是内核的正常使用。假如准备以二进制的形式发布应用程序(像大多数商业软件那样),则必须确保自己的程序未使用GPL保护的任何软件。如果软件通过库函数调用而且使用了其他软件,则不必受此限制。大多数函数库受另一种GNU公共许可证,即LGPL的保护,下面将会介绍。
4.LGPL(Libraray General Public License)
GNU LGPL(GNU程序库通用公共许可证)的内容包括在COPYING.LIB文件中。如果安装了内核源程序,在任意一个源程序的目录下都可以找到COPYING.LIB文件的一个复制。
LGPL允许在自己的应用程序中使用程序库,即使不公开自己的源代码。但是,LGPL还规定,用户必须能够获得在应用程序中使用的程序库的源代码,并且允许用户对这些程序库进行修改。
大多数Linux程序库,包括C程序库(libc.a)都属于LGPL范畴。因此,如果在Linux环境下,使用GCC编译器建立自己的应用程序,程序所连接的多数程序库是受LGPL保护的。如果想以二进制的形式发布自己的应用程序,则必须注意遵循LGPL有关规定。
遵循LGPL的一种方法是,随应用程序一起发布目标代码,并发布这些目标程序和受LGPL保护的、更新的Linux程序库连接起来的makefile文件。
遵循LGPL的另一种方法是使用动态连接。使用动态连接时,即使程序在运行中调用函数库中的函数,应用程序本身和函数库也是不同的实体。通过动态连接,用户可以直接使用更新后的函数库,而不用对应用程序重新连接。