LinuxC(编)程从入门到精通(“十二五”国家重点图书出版规划项目)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-18 09:09:57

点击下载

作者:宋磊程钢(编著)

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

LinuxC(编)程从入门到精通(“十二五”国家重点图书出版规划项目)

LinuxC(编)程从入门到精通(“十二五”国家重点图书出版规划项目)试读:

前言

行业背景

Linux操作系统是一种类UNIX操作系统,其代码是开源的,任何开发者、爱好者都可以免费使用,因此一经推出便风靡世界。Linux自从面世以来,经不同开发者和程序员的开发,现在存在着许多不同的版本,这些版本的根本都在于使用了Linux内核。当前,Linux操作系统安装在各种各样的计算机设备中,包括手机、平板电脑、游戏控制器、台式计算机、大型机和超级计算机。Linux 是一个领先的操作系统,世界上运算最快的 10台超级计算机运行的都是Linux操作系统。

关于本书

本书是 Linux C 语言开发的基础教程,通过讲解基础知识并配合应用实例的方式,由浅到深地讲解 Linux C 语言的使用方法和开发技巧。本书的宗旨在于让读者简单、容易地学会 Linux C 语言的开发方法。本书是由资深 Linux 工程师和高校老师联合编写的,力求内容浅显易懂、讲述平和通俗、实例新颖实用,以期本书能够成为读者的良师益友。

主要内容

第1章,“Linux基础”,包括Linux的起源,发展和分类,Linux的Shell,Shell的使用基础以及Linux常用命令的简单介绍。

第2章,“在Linux中编写C语言代码”,包括Linux系统中C语言开发流程和工具介绍、Linux系统中的C语言编译器、Linux系统中的代码编辑器、Linux系统中的调试环境等内容。

第3章,“Linux 编程进阶”,包括 Linux 如何执行一个程序、Linux 的程序存储空间、Linux C 的 main 函数、Linux 的出错处理、Linux C 的标准输入和输出函数、Linux C 的内存分配、Linux C 的系统调用和库函数以及 Linux 库函数说明和应用实例等内容。

第4章,“Linux的文件编程”,包括Linux的文件系统介绍、Linux的基础文件操作函数、Linux的高级文件操作函数和目录文件操作等内容。

第5章,“Linux 的流编程”,包括 Linux 的流操作基础、流的打开和关闭、流的缓冲方式和缓冲区设置、流的读写、流的定位、流的格式化输出和输入以及临时文件等。

第6章,“Linux的进程”,包括Linux进程基础、Linux的进程控制、Linux进程的其他操作等内容。

第7章,“Linux的线程”,包括Linux线程基础、线程的操作、线程的私有数据处理、线程的属性、线程的同步方式等。

第8章,“Linux的信号和进程间通信”,包括Linux的进程通信和信号基础、信号的基础操作、Linux的信号集以及信号的阻塞和挂起等。

第9章,“Linux的管道、命名管道和进程间通信”,包括Linux的管道基础、Linux的管道操作、Linux的命名管道基础、Linux的命名管道操作等内容。

第10章,“Linux 的 System V IPC 进程通信”,包括 Linux 的 System V IPC 进程通信基础、消息队列、信号量、共享内存等内容。

本书特色

· 本书按照循序渐进的原则讲解 Linux 系统的结构和指令系统——Linux C 的基础知识、Linux C 开发方法和技巧,最后给出应用开发实例。

· 全书包含了大量的通用开发实例,读者可以按照实例实际动手开发,增加实战经验。

· 在讲解知识点的同时,也一并给出了作者在实际开发中遇到的难点和注意事项。

阅读对象

本书的读者对象为 Linux 系统以及 Linux C 编程的爱好者和初学者,也可供大中专院校学生作为教程或参考书使用。

作者介绍

本书由宋磊主编,程钢参与了本书部分章节的编写。同时,参与本书编写工作的还有刘艳伟、严雨、马宏宇、张宪栋、刘燕祎、梅乐夫、周丰、郑鹏思、房明浩、王亮、石峰、刘变红、林远长、汤嘉立、朱飞、刘会灯、岂兴明、周建兴、赵红波、矫津毅、张高煜、邓志宝、刘坤、刘明辉、李鹏、步士建、杨平等,在此一并表示感谢!

由于时间仓促、程序和图表较多,受学识水平所限,错误之处在所难免,请广大读者给予批评指正。

编者

2013年11月第1章Linux基础

Linux是一套免费使用和自由传播的类UNIX操作系统,它已发展成为现今世界上最流行的一种操作系统。Linux不仅仅能在PC机上运行,随着嵌入式系统的发展,它已经被广泛地应用于各种场合。1.1 Linux的起源、发展和分类

Linux从1991年问世到现在已经有20多年的历史,它从一个架构简单的系统内核发展到了现在结构完整、功能丰富的多版本操作系统,本小节将介绍其起源发展和分类。1.1.1 Linux的起源、特点和版本号

1.起源

Linux 操作系统是一种类 UNIX 操作系统,它最早是由芬兰人 Linus Torvalds 设计的。

在Linux诞生之前,为了教学和研究的需要,阿姆斯特丹Vrije大学的计算机科学家Andrew S. Tanwnbaum以UNIX为蓝本开发了Minix作为一个教育工具。1991年初,Linus 开始在一台386sx 兼容微机上学习Minix 操作系统。通过学习,他逐渐不满足Minix 系统的现有性能,并开始酝酿开发一个新的免费操作系统,这很快就在Minix新闻组得到了响应。

到了 1991年的 10月5日,Linus 在 comp.os.minix 新闻组上发布消息,正式向外宣布 Linux 内核系统(Free minix-like kernel sources for 386-AT:0.02 版)的诞生。1991年11月,Linux 0.10 版本推出;0.11 版本随后在 1991年12月推出。当 Linux 非常接近于一种稳定可靠的系统时,Linus决定将0.13版本改称为0.95版本。后来,在1994年3月,终于出现了带有独立宣言意味的 Linux 1.0 版本。Linux 1.0 已经是一个功能完备的操作系统了,其内核写得紧凑高效,可以充分发挥硬件的性能,在4MB内存的80386机器上也表现得非常好。

事实上,Linux系统是全世界各地成千上万志愿者设计和实现的,其目的是建立不受任何商品化软件版权制约的、全世界都能自由使用的类UNIX操作系统。在Linux操作系统的设计过程中,借鉴了很多UNIX的思想,但源代码是全部重写的。目前Linux操作系统可以运行在 x86、Aplpa、MIPS、Power Mac、ARM 等类型的计算机上。从功能上来看,它既可以作为普通的桌面操作系统,也可以作为中小型的网络操作系统,甚至还可以作为大型网络的操作系统。

2.特点

Linux具有以下特点。

● Linux 是一个免费软件。Linux 是作为开放源码的免费软件的代表,正是由于这一点,来自全世界的无数程序员参与了Linux的修改和编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让 Linux 吸收了无数程序员的精华,不断壮大。

● 完全兼容 POSIX 1.0 标准。POSIX 是基于 UNIX 的第一个操作系统国际标准,这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows程序。

注意:关于POSIX,将在1.1.5小节中进行介绍。

● 多用户、多任务系统。Linux 支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在操作系统最主要的特点,Linux中多个程序可以同时独立地运行。

● 良好的用户界面。Linux 向用户提供了两种界面:文本界面和图形用户界面。Linux的传统用户界面是基于文本的命令行界面,即Shell。它既可以联机使用,又可存在文件上脱机使用。

● Linux 还为用户提供了图形用户界面。可以利用鼠标、菜单、窗口、滚动条等对图形用户界面进行操作。Linux 给用户呈现一个直观、易操作、交互性强的友好的图形化界面。Linux 的图形用户界面最近几年有很大的改进。在图形用户界面下,几乎可以完成全部的工作。

● 支持多种文件系统。Linux 能支持多种文件系统。目前支持的文件系统有 EXT、EXT2、EXT3、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、 PROC、NFS、XFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、NTFS、AFFS等。

● 丰富的网络功能。完善的内置网络功能是 Linux 的一大特点。 Linux 在通信和网络功能方面优于其他操作系统。其他操作系统不包含如此紧密地和内核结合在一起的连接网络的能力,而且通信和网络相关功能缺乏灵活性。

● 可靠的系统安全。Linux 采取了许多安全技术措施,包括对读和写进行权限控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。

● 良好的可移植性。Linux 是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。可移植性为运行Linux的不同计算机平台与其他任何机器进行准确而有效的通信提供了手段,不需要另外增加特殊的和昂贵的通信接口。

3.版本号

任何一个软件都有版本号,例如微软的 Windows 7,Office 2007 等,Linux 也不例外。Linux的版本号又分为两部分:内核(Kernel)与发行套件(Distribution)版本。

Linux的内核是系统的心脏,内核包括了几百万行代码,是运行程序和管理硬件设备的核心程序。没有内核,就不能运行程序,但内核不是操作系统的全部。Linux初学者常会把内核版本与发行套件版本弄混,实际上内核版本指的是在Linus领导下的开发小组开发出的系统内核的版本号。Linux的每个内核版本为类似x.y.zz-www的一组数字。其中,x.y为Linux的主版本号,zz为次版本号,www代表发行号(注意,它与发行版本号无关)。当内核功能有一个飞跃时,主版本号升级,如 Kernel 2.2、Kernel 2.4、Kernel 2.6 等。内核增加了少量补丁时,常常会升级次版本号,如 Kernle 2.6.15、Kernel 2.6.20 等。当然还有更复杂的版本号系统,如2.6.20-32等。通常,若y为奇数,表示此版本为测试版,系统会有较多漏洞,主要用途是提供给用户测试。随着每一次对系统的小的bug的修正,zz会增加。编写本书时,Linux的内核最新稳定版本号是3.0.3(主版本号3.0表明它是可以使用的稳定版本)。

一般而言,一个基本的Linux只是包含了Linux内核和GNU软件的一些基本的系统软件和实用工具(Utilities),这样一个操作系统仅仅能够让那些Linux专家完成一些很基本的系统管理任务,若要满足普通用户的办公或基于视窗的应用开发等需求,则还需要在系统中加入GNOME、KDE等桌面环境以及相应的办公应用软件(如Office)等。因此一些组织或厂家将Linux系统内核与GNU软件(系统软件和工具)整合起来,并提供一些安装界面和系统设定与管理工具,这样就构成了一个发行套件,例如最常见的 Ubuntu,Fedora等。实际上发行套件就是Linux的一个大软件包而已,通常包括C语言及C++的编译器、Perl 脚本解释程序、Shell 命令解释器、图形用户界面以及众多的应用程序等。相对于内核版本,发行套件的版本号随发布者的不同而不同,与系统内核的版本号是相对独立的。因此把Ubuntu、Fedora等直接说成是Linux是不确切的,它们是Linux的发行版本,更确切地说,应该叫做“以Linux为核心的操作系统软件包”。根据GPL准则,这些发行版本虽然都源自一个内核,并都有自己各自的贡献,但都没有自己的版权。Linux的各个发行版本,都是使用Linus主导开发并发布的同一个Linux内核,因此在内核层不存在兼容性问题。至于每个版本都不一样的感觉,只是在发行版本的最外层才有所体现,而绝不是本身,也不是内核不统一或不兼容。

目前Linux的发行版很多,其中比较流行的国外版本有Ubuntu、Fedora、Slackware、Debian、OpenSUSE和Mandriva等;国内的有红旗Linux和TurboLinux等。

例如最新的 Ubuntu 的内核版本表示如下(可以通过在终端中输入“uname -a”命令来查看)。

alloeat@Ubuntu:~$ uname -a

Linux Ubuntu 3.2.0-27-generic-pae #43-Ubuntu SMP Fri Jul 6 15:06:05 UTC 2012 i686i686 i386 GNU/Linux

而其发行套件版本号则表示如下(可以通过“sudo lsb_release -a”命令来查看。需要注意的是,执行这个命令需要超级用户权限)。

Distributor ID: Ubuntu

Description: Ubuntu 12.04 LTS

Release:  12.04

Codename:  precise1.1.2 Linux的结构

Linux 既是一个操作系统的名称,也是一个操作系统内核的名称。一个完整的 Linux操作系统由Linux内核、Shell、文件系统和实用工具组成,如图1.1所示。图1.1 Linux 的结构

1.Linux内核

内核是 Linux 操作系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。

2.Shell

Shell 是系统的用户界面,提供了一种用户与内核进行交互操作的接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell应该是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言,用于对命令进行编辑,它允许用户编写由Shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

除了 Shell 之外,Linux 同样提供了像 Windows 那样的可视的命令输入界面,即 XWindow 的图形用户界面(GUI)。它提供了很多窗口管理器,其操作就像 Windows 操作一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。现在比较流行的窗口管理器是KDE和GNOME。

注意:X Window 的实质是 Linux 实用工具的一种,请参考“Linux 的实用工具”小节。

每个 Linux 系统的用户可以拥有自己的用户界面或 Shell,用以满足他们自己特有的需求。

同Linux本身一样,Shell也有多种不同的版本,下面是目前主流的Shell。

● Bourne Shell:是贝尔实验室开发的。

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

● Korn Shell:是对 Bourne Shell 的发展,大部分内容与 Bourne Shell 兼容。

● C Shell:是 SUN 公司 Shell 的 BSD 版本。

3.Linux的文件结构

文件结构是文件存放在磁盘等存储设备上的组织方法,其主要体现在对文件和目录的组织上。

目录为文件管理提供了一个方便而有效的途径,用户可以从一个目录切换到另一个目录,而且可以设置目录和文件的权限,设置文件的共享程度。在Linux系统中,用户可以设置目录和文件的权限,以便允许或拒绝其他人对其进行访问。Linux目录采用多级树形结构,用户可以浏览整个系统,可以进入任何一个已授权进入的目录,访问其中的文件。

文件结构的相互关联性使共享数据变得容易,几个用户可以访问同一个文件。Linux是一个多用户系统,系统本身的驻留程序存放在以根目录开始的专用目录中,有时被指定为系统目录。

4.Linux的实用工具

Linux操作系统通常都提供一系列叫做实用工具的应用程序,这些实用工具包括与用户进行人机交互的 X Window、计算器、浏览器等,主要是用于增加系统可用性。和 Windows把这些工具(主要是 X Windows)集合到一起不能分离不同,Linux 的实用工具都可以让用户自定义。整体来说,Linux的实用工具可分为如下三类。

● 编辑器。用于编辑文件,Linux 常见的编辑器有 Ed、Ex、Vi 和 Emacs。Ed 和 Ex是行编辑器,Vi和Emacs是全屏幕编辑器。

● 过滤器。用于接收数据并过滤数据,Linux 的过滤器读取从用户文件或其他地方的输入,检查和处理数据,然后输出结果。从这个意义上说,它们过滤了经过它们的数据。Linux 有不同类型的过滤器,一些过滤器用行编辑命令输出一个被编辑的文件。另外一些过滤器是按模式寻找文件并以这种模式输出部分数据。还有一些执行字处理操作,检测一个文件中的格式,输出一个格式化的文件。过滤器的输入可以是一个文件,也可以是用户从键盘键入的数据,还可以是另一个过滤器的输出。过滤器可以相互连接,因此一个过滤器的输出可能是另一个过滤器的输入。在有些情况下,用户可以编写自己的过滤器程序。

● 交互程序。交互程序允许用户发送信息或接收来自其他用户的信息,交互程序是用户与机器的信息接口。Linux是一个多用户系统,它必须和所有用户保持联系。信息可以由系统上的不同用户发送或接收。信息的发送有两种方式,一种方式是与其他用户一对一地链接进行对话,另一种是一个用户对多个用户同时链接进行通信,即所谓广播式通信。1.1.3 Linux操作系统的分类

前面介绍过,Linux的关键是Linux内核,可以将相同内核通过不同的“包装”生成不同的Linux操作系统,这种包装好的Linux操作系统通常被称为发行版。发行版为许多不同的目的而制作, 包括对不同计算机结构的支持。对一个具体区域或语言的本地化实时应用和嵌入式系统,甚至许多版本故意只加入免费软件。目前,正在开发的Linux发行版超过300个,最普遍使用的发行版有大约12个。

现在市场上存在的Linux发行版种类非常多,但是通常来说可以根据包管理系统或者X Window 系统来进行分类。

1.根据包管理系统分类

Linux操作系统中所安装的软件通常都是以包的形式存在的。通常来说,包中除了可执行文件之外,其中还包括了该包的依赖关系、设置文件等。

所谓依赖关系,就是指Linux软件运行所必须的其他条件,比如说软件A在运行的时候需要相应的库a,如果此时没有安装库,则软件A就不能正常运行,通常将这种情况称为软件A的依赖关系没有满足。

由于Linux中软件和库都非常多,并且一个库可能涉及多个软件,所以Linux提供了相应的包管理系统来对这些包进行管理,目前市场占有率最高的两个包管理软件是 RPM包管理软件和Deb包管理软件。

bRPM 包管理软件的全称是 Red Hat Package Manager,它是 Red Hat 公司设计的一套包管理软件,其中包括了软件的可执行程序、相关的配置文件等。用解压缩工具解开 RPM包即可以看到其中的内容,但是如果安装RPM包则需要使用相应的包管理工具。

RPM 的包管理工具可以提供包的安装、卸载、查询、打包等功能,在打好的包里面有可执行程序以及相应的安装、依赖关系,以下是几个常用的RPM包操作命令。

● rpm -vih file.rpm:安装一个 RPM 包。

● rpm -e file.rpm:卸载一个 RPM 包。

● rpm -qpR file.rpm:查看 RPM 包的依赖关系。

● rpm -q file:查询系统已安装的 RPM 包。

下面是使用RPM包管理工具的常见发行版。

● Red Hat。是美国 RedHat 公司的产品,是相当成功的一个 Linux 发行版本,也是目前使用最多的Linux发行版本。Red Hat最早由Bob Young和Marc Ewing在1995年创建。原来的 Red Hat 版本早已停止技术支持,目前 Red Hat 的 Linux 分为两个系列,其中一个是由Red Hat公司提供收费技术支持和更新的Red Hat Enterprise Linux 系列;另一个是由社区开发的免费的 Fedora Core 系列。Red Hat 因其易于安装而闻名,在很大程度上减轻了用户安装程序的负担,其中 RedHat 提供的图形界面安装方式与Windows系统的软件安装方式非常类似,这对于那些Windows用户而言,几乎可以像安装 Windows 系统一样轻松安装 Red Hat 发行套件。

● 红旗 Linux。是由北京中科红旗软件技术有限公司开发的一系列 Linux 发行版,包括桌面版、工作站版、数据中心服务器版、HA集群版和红旗嵌入式Linux等产品。

和RPM包管理系统相对应的是Deb包管理系统,Deb的包也是由源代码包和二进制包组成的,其详细说明如下。

● 源代码包。包括一个描述源代码包的 .dsc 文件,一个包含 gzip-tar 归档压缩格式的未经修改源码的 .orig.tar.gz 文件,一个包含对源代码作 Debian 特有修改的 .diff.gz 文件。可以使用 dpkg-source 打包和解压 debian 源码文档。详见联机手册。

● 二进制包。以.deb 扩展名来表示,这些文件通常称为 DEB 文件,其中包含可执行文件、文档、配置文件和版权信息及其他一些东西。可以使用Debian的dpkg工具解包(安装)。但除去版权信息(和 changelog.Debian 文件)外,二进制包也可以是空的,这种软件包作为过渡包或关联包(也称虚拟包),它们唯一的作用是用于满足依赖性。

一般而言,用户只和二进制包打交道,只有在某些特殊情况下才会求助于源代码包,Debian软件包命名遵循下列约定。

_<版本号>-.deb

Deb包管理系统同样提供了相应的命令,用于管理操作。常用的命令说明如下。

● apt 命令:用于从源列表(可以是 CD、网络等)下载 Deb 包。

● dpkg 命令:通过数据库来对系统中的软件进行管理,这个数据库位于/var/lib/dpkg目录中。

● aptitude 命令:提供图形界面对软件包进行管理,功能较为强大,甚至可以通过终端远程登录运行,如图1.2所示。图1.2 aptitude 命令的运行界面

● synaptic:新立得软件包管理器,这是一个运行在 X Window 环境中的包管理软件,用户可以进行图形化的操作。

● gdebi 和 gdebi-gtk:gdebi 是一个命令行的包管理软件,gdebi-gtk 是其对应的图形化版本。

● dselect:在终端运行的一个图形化软件包管理工具,其功能实现类似 synaptic,但是能在终端中运行,如图1.3所示。

采用Deb包管理系统的发行版最常见的是Debian和Ubuntu。

● Debian 是一款能安装在计算机上使用的操作系统。操作系统就是能让计算机工作 的一系列基本程序和实用工具。由于 Debian 采用了 Linux Kernel (Linux 操作系统的核心),但是大部分基础的操作系统工具都来自于 GNU 工程,因此又称为 GNU/Linux。Debian GNU/Linux 附带了超过 29 000 个软件包,这些预先编译好的软件被包装成一种良好的格式,以便于在机器上进行安装。让 Debian 支持其他内核的工作也正在进行,最主要的就是 Hurd。Hurd 是一组在微内核(例如Mach)上运行的提供各种不同功能的守护进程。图1.3 dselect 的运行界面

● Ubuntu 是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“Ubuntu”一词(译为吾帮托或乌班图),意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和GNOME桌面环境。它与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由免费软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。

注意:实际上还存在其他的包管理系统,在此不再过多叙述,有兴趣的读者可以自行去查阅相应的书籍。

2.根据 X Window 系统进行分类

X Window 即 X Windows 图形用户接口,是一种计算机软件系统和网络协议,它提供了一个基础的图形用户界面(GUI)、丰富的输入设备驱动,并且能提供网络连接,其中软件的编写使用了广义的命令集。它创建了一个硬件抽象层,允许设备独立性和重用方案的任何计算机上实现。

Linux的内核并不像Windows系统那样直接集成了用户能够使用的图形化界面,而X Window即是实现这种功能的应用软件,可以分为KDE和GNOME两大类。

KDE 是 K 桌面环境(Kool Desktop Environment)的缩写,这是一种著名的运行于 Linux、UNIX 以及 FreeBSD 等操作系统上的自由图形工作环境,整个系统采用的都是由 TrollTech 公司所开发的 Qt 程序库(现在属于诺基亚公司),具有以下特点。

● 提供了一个美观的现代化桌面。

● 提供了一个具有完整的网络透明性的桌面。

● 提供了一个方便的集成帮助系统,它提供了对 KDE 桌面及其应用程序帮助的一致化访问途径。

● 所有的 KDE 应用程序都具有统一的视觉观感。

● 具有标准化的菜单、工具栏、键盘绑定、颜色样式等。

● 国际化支持,KDE 已拥有 60 余种语言的翻译。

● 集中化组织的对话框系统,由具体的桌面配置来运作。

● 大量优秀的 KDE 应用程序。

使用 KDE 作为 X Window 系统的常见 Linux 发行版包括 KUbuntu、Fedora、Mint、openSUSE、Mandriva、Debian等。

GNOME 是另外一种能在 Linux 操作系统上运行的 X Window 应用软件,是 GNU 计划的一部分。它是一种让使用者容易操作和设置电脑环境的工具,目标是基于免费软件,为UNIX或者类UNIX操作系统构造一个功能完善、操作简单以及界面友好的桌面环境,是GNU计划的正式桌面。GNOME可以运行在包括GNU/Linux(通常叫做Linux)、Solaris、HP-UX、BSD 和 Apple's Darwin 系统上。GNOME 拥有很多强大的特性,如高质量的平滑文本渲染、首个国际化和可用性支持,并且包括对反向文本的支持(注: 有些国家的文字是从右向左排版的)。

采用 GNOME 作为默认 X Window 的 Linux 发行版并不太多,但是在绝大部分发行版上都可以自行安装,图1.4 是一个使用 GNOME 作为 X Window 应用界面的 Ubuntu 的运行界面。

注意:通常来说,X Window 只是作为 Linux 操作系统人机交互的一个应用软件,用户可以根据自己的兴趣爱好等实际情况来自行安装对应的 X Window。X Window 和其他应用软件在理论上关系不大,但是在实际应用中,由于图形库等依赖关系,一些软件在GNOME上支持得比KDE上好或者差等情况都可能出现,最典型的例子就是在第2章中介绍的VIM和EMACS。

3.本书所选择Linux发行版

本书选择发行版本号为 12.04、内核版本号为 3.2.0-27、X Window 为 GNOME 2 的Ubuntu系统来介绍Linux下的C语言编程。在实际应用中,由于本书所涉及的大部分知识都只与Linux内核和GCC库相关,所以对于绝大多数发行版而言都是适用的。图1.4 使用 GNOME 的 Ubuntu 操作系统

注意:本书并不涉及Linux的图形编程以及其他的应用软件等深层次的应用。1.1.4 Linux中的几个术语

在Linux中,有几个术语是Linux下的C语言程序员必须了解的,如GNU、GPL、POSIX 和 ISO C。

1.GNU

GNU 是“GNU's Not UNIX”的缩写,其发音为“Guh-NOO”,原意为非洲牛羚。GNU最开始由Richard Stallman建立于1983年,目的是为了实现一个符合UNIX系统接口标准、软件丰富且可以自由使用的软件库,因此GNU计划可以分别开发不同的操作系统部件。GNU 计划采用了部分当时已经可自由使用的软件,例如 TeX 排版系统和 X Window 视窗系统等,同时也开发了大批其他的免费软件。

1985年Richard Stallman 又创立了免费软件基金会(FSF,Free Software Foundation)其目的是为GNU计划提供技术、法律以及财政支持。尽管GNU计划大部分时候是由个人自愿无偿贡献的,但FSF有时还是会聘请程序员帮助编写。当GNU计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持,其中最著名的就是之后被 Red Hat 兼并的 Cygnus Solutions。

到1990年,GNU计划已经开发出的软件包括了一个功能强大的编辑器Emacs、GCC (GNU Compiler Collection,GNU编译器集合,也是本书所使用的编译器)以及大部分UNIX系统的程序库和工具,唯一依然没有完成的重要组件就是操作系统的内核。

GNU 包含以下 3 个协议条款。

● GPL:GNU 通用公共许可证(GNU General Public License)。

● LGPL:GNU 较宽松公共许可证 (GNU Lesser General Public License),也被称为 GNU Library General Public License (GNU 库通用公共许可证)。

● GFDL:GNU 自由文档许可证(GNU Free Documentation License )。

2.GPL

GPL并非由免费软件基金会所发表,亦非使用GNU通用公共授权的软件的法定发布条款,只有GNU通用公共授权英文原文的版本才具有此等效力。

GPL 要求在发布软件的同时必须发布源代码,并且允许任何用户能够以源代码的形式将软件复制或者发布给别的用户。如果一个软件使用了遵循 GPL 的任何软件的全部或者一部分,则该软件也必须遵循GPL。

需要注意的是,GPL并不是免费软件的代名词,其支持商业化的收费软件。

3.POSIX

POSIX 是可移植的 UNIX 操作系统接口(Portable Operating System Interface of UNIX)的缩写,其由 IEEE(Institute of Electrical and Electronic Engineering)所开发,由 ANSI 和ISO标准化。

POSIX 的最初开发目的是为了提高 UNIX 环境下应用程序的可移植性,但是随着其发展,POSIX 现在并不局限于 UNIX 环境,许多其他的操作系统,包括 Linux 和 Windows,也支持POSIX的部分或者全部。

4.ISO C

C 语言是由 Dennis M. Ritchie 在 1973年设计和实现的,并且在 1978年通过《The C Programming Language》一书将 C 语言推向全世界。

美国国家标准局(ANSI)在 1988年10月颁布 ANSI 标准 X3.159-1989(即 ANSI C标准)),随后国际标准(ISO)在 1989年左右采纳 ANSI C 标准,并且将其定义为 ISO/IEC 9899:1990,这就是 ISO C。

随着计算机技术的不断发展,ISO C 的版本号也在随之发展,到目前为止最新的 ISO C 版本号是 ISO/IEC 9899:1999,也就是 C99。1.2 Linux的Shell

Shell,俗称壳(用来区别于核),是指“提供给使用者使用的界面”的软件(命令解析器),类似于 DOS 下的 command.com。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令,或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

Shell并不是Linux独有的东西,Windows下也同样有。Shell也不仅仅是以命令行形式出现的,其实 X Windows 也是 Shell 的一种,不过在本小节中所特指的 Shell 是 Linux下以命令行形式提供的。

Shell 基本上是一个命令解释器,接收用户命令,然后调用相应的应用程序来执行这些命令。1.2.1 常见的Shell

常见的Shell包括ash、bash、ksh、csh和zsh,共5种,简要介绍如下。

● ash:ash 是由 Kenneth Almquist 编写的,是 Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

● bash:bash 是 Linux 系统默认使用的 Shell,它由 Brian Fox 和 Chet Ramey 共同完成,是 Bourne Again Shell 的缩写,一共有 40 个内部命令。Linux 之所以使用它作为默认的Shell,是因为它有以下的特色:可以使用类似DOS中doskey的功能,用上下方向键查阅和快速输入并修改命令;自动通过查找匹配的方式,给出以某字符串开头的命令;包含了自身的帮助功能,只要在提示符下面键入help就可以得到相关的帮助。

● ksh:是 Korn Shell 的缩写,由 Eric Gisin 编写,共有 42 条内部命令。该 Shell 最大的优点是几乎和商业发行版的ksh完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

● csh:它是在 Linux 操作系统中应用比较多的 Shell,由以 William Joy 为代表的共计47位作者编成,共有52个内部命令,该Shell其实是指向/bin/tcsh的Shell。也就是说,csh其实就是tcsh。

● zch:这是 Linux 最大的 Shell 之一,由 Paul Falstad 完成,共有 84 个内部命令。如果只是一般的用途,是没有必要安装这样的Shell。

可以在终端下使用相应的命令来查看当前Linux操作系统中使用的Shell,Ubuntu中默认使用的Shell是bash。alloeat@Ubuntu:/$ echo $SHELL/bin/bash1.2.2 Shell和终端

和 Linux 内核类似,Shell 仅仅提供了一个计算机和用户进行交互的内核,而其具体的命令行输入输出交流要通过终端来完成,在Linux操作系统中,用户也可以自定义终端来完成相应的工作,Ubuntu1 2.04发行版自带的终端是 Terminal,其运行界面如图1.5所示。图1.5 终端运行界面1.2.3 Shell的工作方式

Shell 既可以作为命令行提供给用户控制内核完成相应的任务,也可以作为一种编程语言供开发者使用。

1.命令行工作方式

在命令行工作方式下,Shell 识别并且对用户输入的字符串进行响应,以完成相应的工作,这种工作方式通常也被称为“交互式”的工作方式。当用户有输入的时候,Shell才对其做出相应的响应。

2.编程语言工作方式

Shell 同样可以用作编程语言,在 Linux 中存在一种特殊的可执行文件,其内容是一系列由各种命令组成的纯文本文件(脚本文件),通常用于完成某些步骤比较多的复杂工作,或者是重复性比较强的工作。Shell 可以对这些文件进行识别,并且按照设定自动执行相应的动作,这种工作方式通常也被称为“非交互式”的工作方式,不需要用户输入,Shell会自动做出相应的动作。

注意:Shell还可以用于配置用户的环境,这通常会在Shell的初始化文件中完成,这些配置包括设置窗口属性、快捷键等。1.2.4 Shell的启动

Shell在启动的时候,先读取/etc/bash.bashrc文件对整个Linux操作系统进行配置,然后读取$HOME/.bashrc文件对当前用户进行配置。如果这两个文件有冲突,则以后者为准。和Shell相关的文件如下所示。

● .bash_profile 文件:该文件只能被登录用户对应的 Shell 所读取,而操作系统内未登录的Shell只读取.bashrc文件。

● .bashrc 文件:该文件被启动的所有 Shell 所读取。

● .bash_logout 文件:bash 退出时执行该文件。

如果用户安装了多个Shell,则可以在用户管理的相关目录文件中进行设置。

1.2.2 小节中介绍的终端实际上是一个虚拟终端,是在 X Window 中运行的。如果想要进入完整的“真实终端”,可以使用“Ctrl+Alt+Fn”(Fn 为 F1~F6 快捷键)。

在启动Ubuntu操作系统的时候,会自动启动7个终端,其中1~6号终端均是直接运行的一个“真实终端”,而第7 号终端会给 X Window 使用,如果想要从 1~6 号终端切换到 X Window 下,按下快捷键“Alt + F7”即可。1.3 Shell的使用基础

由于在C语言开发中常常需要和Shell打交道,本小节将简要介绍Shell的基本使用方法,终端的运行界面可以参考图1.5,以下仅仅给出在其中进行操作的相应字符串。1.3.1 Shell命令的标准格式

Shell和用户交互是以字符串形式存在的命令和命令输出反馈的方式进行的,在Linux命令行中输入的第一个字符串必须是一个命令的名字,第二个字符串是命令的选项或参数,命令行中的每个字符串必须由空格键或Ta键隔开,格式如下。

$ 命令 选项 参数

或者

# 命令 选项 参数

提示符“$”和“#”可区分用户的不同权限,“$”表示普通用户权限,而“#”代表的是root用户(超级用户)权限。选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,Linux用它来区别选项和参数),选项可用于改变命令执行的动作的类型。

注意:在Ubuntu操作系统中,用户不能直接使用root权限,只能通过sudo命令来暂时获得root权限。

命令行实际上是一个可以编辑的文本缓冲区,在按回车键之前,可以对输入的文本进行编辑。例如,可以利用“BackSpace”键删除刚键入的字符,可以进行整行删除,还可以插入字符。用户在输入命令(尤其是复杂命令)时,若出现输入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。

利用向上的箭头键可以重新显示刚执行的命令,利用这一功能可以重复执行以前执行过的命令,而无须重新键入该命令。

一个标准的Shell命令和命令的反馈输出如下(这是用ls命令查看当前文件夹下文件列表的执行结果)。

alloeat@Ubuntu:/$ ls

bin cdrom etc host initrd.img.old lost+found mnt proc run selinux sys usr vmlinuz

boot devhome initrd.img lib media opt root sbin srv tmp var vmlinuz.old1.3.2 Shell的通配符

在Shell中除使用普通字符外,还可以使用一些具有特殊含义和功能的字符,称为通配符,在使用它们时应注意其特殊的含义和作用范围。

Shell 的通配符主要用于模式匹配,如文件名匹配、路径名搜索、字串查找等。常用的通配符有“*”、“?”和括在方括号“[ ]”中的字符序列等。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,以在执行过程中进行模式匹配。这3个通配符的含义分别如下。

● “*”代表任意长度的字串。例如,“L*”匹配以 L 开头的任意字串。但应注意,文件名中的圆点(.)和路径名中的斜线(/)必须是显式的,即不能用通配符替代它们。例如,“*”不能匹配.c,而“.*”才可以匹配.c。

● “?”代表任何单个字符。

● “[ ]”指定了模式串匹配的字符范围,只要文件名中“[ ]”处的字符在指定的范围之内,那么这个文件名就与该模式串匹配。方括号中的字符范围可以由字符串组成,也可以由表示限定范围的起始字符、终止字符及中间连字符(-)组成。例如,f [a-d] 与 f [abcd]的作用相同。

Shell 把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。如果目录中没有与指定的模式串相匹配的文件名,那么Shell将使用此模式串本身作为参数传给命令(这正是命令中出现特殊字符的原因所在)。

表1.1列举了这些通配符的具体实例及含义。表1.1 通配符使用实例

需要注意的是,中间连字符(-)仅在方括号内有效,表示字符范围。若在方括号外面,就成为普通字符了,而“*”和“?”则只在方括号外有效,若出现在方括号之内,它们也失去通配符的功能,成为普通字符了。例如,模式 L[*?]abc 中只有一对方括号是通配符,而“*”和“?”均为普通字符,因此,它匹配的字串只能是L*abc和L?abc。【例1.1】是一个使用“*”通配符来让“ls”命令只显示当前文件夹中文件名中带“exam”,扩展名为“.c”的文件的命令和对应输出。【例1.1】“*”通配符应用实例。

alloeat@Ubuntu:~/chapter4Exam$ ls

copytest.txt exam3write.c~ examaccess.c~   examcopy examfcntl.cexammkdir.c~ examtest examvim.c

exam1open   exam4read.c  examchdirgetcwd  examcp.c examlseekexamopendir examumask foo

exam1open.c  exam4read.c~ examchdirgetcwd.c examcp.c~ examlstatexamopendir.c examumask.c lseektest.txt

exam1open.c~  exam5lseek.c examchdirgetcwd.c~ examcpoy examlstat.cexamopendir.c~ examumask.c~ renamebar

exam2create.c exam5lseek.c~ examchmod    examdup examlstat.c~examrename examutime testdir

exam2create.c~ examaccess  examchmod.c   examdup.c exammkdirexamrename.c examutime.c thpic.c

exam3write.c  examaccess.c examchmod.c~   examfcntl exammkdir.cexamrename.c~ examutime.c~

alloeat@Ubuntu:~/chapter4Exam$ ls exam*.c

exam1open.c  exam4read.c examchdirgetcwd.c examdup.c  exammkdir.cexamumask.c

exam2create.c exam5lseek.c examchmod.c   examfcntl.c examopendir.cexamutime.c

exam3write.c examaccess.c examcp.c    examlstat.c examrename.cexamvim.c1.3.3 Shell中的引号

在Shell中可以使用的引号包括单引号、双引号和反引号3种。

1.单引号

由单引号括起来的字符都作为普通字符使用。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如,下面的一系列命令:

alloeat@Ubuntu:~/chapter4Exam$ string='$PATH'

alloeat@Ubuntu:~/chapter4Exam$ echo $string

$PATH

可见,单引号中的“$”保持了其本身的含义,作为普通字符出现,而在一般情形下,“$”符号的含义是引用变量的值,PATH本身是一个Linux系统中的环境变量,其值是一系列的目录,当用户运行某个程序时,Linux在这些目录下进行搜寻。可以使用下面的命令查看变量PATH的值。

#echo $PATH

2.双引号

双引号的作用与单引号类似,区别在于它没有那么严格。单引号告诉Shell忽略所有的特殊字符,而双引号只要求忽略大多数特殊字符。具体来说,不会忽略括在双引号中的3 种特殊字符,即$、\和` ,即双引号会解释字符串的特别意义,而单引号则直接使用字符串。如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。如果要查询包含空格的字符串,经常会用到双引号。

看看【例1.2】中的应用实例。【例1.2】双引号应用实例。

alloeat@Ubuntu:/$ x=* //定义字符变量 x

alloeat@Ubuntu:/$ echo $x //显示 x 的值

bin boot cdrom dev etc home host initrd.img initrd.img.old lib lost+found media mntopt proc root run sbin selinux srv sys tmp usr var vmlinuz vmlinuz.oldalloeat@Ubuntu:/$ echo '$x' //单引号$xalloeat@Ubuntu:/$ echo "$x" //双引号*

从【例1.2】中,可以清楚地看出无引号、单引号和双引号之间的区别。

● 第一种情况,显示变量 x 的值。由于 x 的值,即字符“*”匹配了当前目录(root目录)下的所有文件名,故显示变量x的值时,会显示当前目录的所有文件名。

● 第二种情况,使用了单引号。单引号中的字符保持其本身的含义,这种情况最简单。

● 最后一种情况,使用了双引号。双引号告诉 Shell 在引号内照样进行变量名替换,所以Shell把$x替换为*,因为双引号中不做文件名替换(忽略掉了非特殊字符),所以就把“*”作为要显示的值传递给echo命令,作为echo命令的参数。

另外,从例子中还可以看到Shell赋值的先后次序:Shell先进行变量替换,然后进行文件名替换,最后把这些替换值作为参数传递给命令。

3.反引号

反引号“`”字符所对应的键一般位于键盘的左上角,不要将其同单引号“'”混淆。反引号括起来的字串被Shell解释为命令行。在执行时,Shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如:alloeat@Ubuntu:/$ pwd/alloeat@Ubuntu:/$ string="current directory is `pwd`"alloeat@Ubuntu:/$ echo $stringcurrent directory is /

Shell执行echo命令时,首先执行`pwd`中的命令pwd,并使用输出结果“/”取代`pwd`部分,最后输出替换后的整个结果。

利用反引号的这种功能可以进行命令置换,即把反引号括起来的执行结果赋值给指定变量。再例如:

alloeat@Ubuntu:/$ today=`date`

alloeat@Ubuntu:/$ echo today is $today

today is 2012年08月03日 星期五 16:58:54 CST

另外,反引号还可以嵌套使用。但需要注意的是,嵌套使用时内层的反引号必须用反斜线(\)将其转义。1.3.4 Shell中的注释符

在Shell编程或Linux的配置文档中,经常要对某些正文行进行注释,以增加程序的可读性。在 Shell 中以字符 “# ”开头的正文行表示注释行。1.4 Linux的常用命令

在 Shell 中,用户需要通过使用适当的命令来完成相应的操作,本小节将介绍 Linux中的部分常用命令。1.4.1 文件操作命令

文件操作是Linux系统里最基本也是最常用的操作,本节列举了Linux中经常执行的一些普通文件操作命令。

1.显示文件列表

显示指定工作目录中所包含内容的命令是ls。要说明的是,ls命令列出的是文件的名字,而不是文件的内容。该命令的使用方式如下。

ls [选项] [文件目录列表]

ls命令中的常用选项如表1.2所示。表1.2 ls 命令选项说明

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载