本书讲述在Linux系统及其他UNIX风格的操作系统上进行的程序开发,主要内容包括标准Linux C语言函数库和由不同的Linux或UNIX标准指定的各种工具的使用方法,大多数标准Linux开发工具的使用方法,通过DBM和MySQL数据库系统对Linux中的数据进行存储,为X视窗系统建立图形化用户界面等。本书通过先介绍程序设计理论,再以适当的例子和清晰的解释来阐明它的方式,帮助读者迅速掌握相关知识。\r\n 本书适合Linux的初学者及希望利用Linux进行开发的程序设计人员阅读,也适合作为高等院校计算机相关专业师生的参考教材。
第1章 入门 \r\n 1.1 UNIX、Linux和GNU简介 \r\n 1.2 Linux程序设计 \r\n 1.3 获得帮助 \r\n 1.4 小结 \r\n第2章 shell程序设计 \r\n 2.1 为什么使用shell编程 \r\n 2.2 一点哲学 \r\n 2.3 什么是shell \r\n 2.4 管道和重定向 \r\n 2.5 作为程序设计语言的shell \r\n 2.6 shell的语法 \r\n 2.7 迈向图形化:dialog工具 \r\n 2.8 综合应用 \r\n 2.9 小结 \r\n第3章 文件操作 \r\n 3.1 Linux文件结构 \r\n 3.2 系统调用和设备驱动程序 \r\n 3.3 库函数 \r\n 3.4 底层文件访问 \r\n 3.5 标准I/O库 \r\n 3.6 格式化输入和输出 \r\n 3.7 文件和目录的维护 \r\n 3.8 扫描目录 \r\n 3.9 错误处理 \r\n 3.10 /proc文件系统 \r\n 3.11 高级主题:fcntl和mmap \r\n 3.12 小结 \r\n第4章 Linux环境 \r\n 4.1 程序参数 \r\n 4.2 环境变量 \r\n 4.3 时间和日期 \r\n 4.4 临时文件 \r\n 4.5 用户信息 \r\n 4.6 主机信息 \r\n 4.7 日志 \r\n 4.8 资源和限制 \r\n 4.9 小结 \r\n第5章 终端 \r\n 5.1 对终端进行读写 \r\n 5.2 与终端进行对话 \r\n 5.3 终端驱动程序和通用终端接口 \r\n 5.4 termios结构 \r\n 5.5 终端的输出 \r\n 5.6 检测击键动作 \r\n 5.7 虚拟控制台 \r\n 5.8 伪终端 \r\n 5.9 小结 \r\n第6章 使用curses函数库管理基于文本的屏幕 \r\n 6.1 用curses函数库进行编译 \r\n 6.2 基本概念 \r\n 6.3 初始化和重置函数 \r\n 6.4 输出到屏幕 \r\n 6.5 从屏幕读取 \r\n 6.6 清除屏幕 \r\n 6.7 移动光标 \r\n 6.8 字符属性 \r\n 6.9 键盘 \r\n 6.10 窗口 \r\n 6.11 子窗口 \r\n 6.12 keypad模式 \r\n 6.13 彩色显示 \r\n 6.14 pad \r\n 6.15 CD唱片应用程序 \r\n 6.16 小结 \r\n第7章 数据管理 \r\n 7.1 内存管理 \r\n 7.2 文件锁定 \r\n 7.3 数据库 \r\n 7.4 CD唱片应用程序 \r\n 7.5 小结 \r\n第8章 MySQL \r\n 8.1 安装 \r\n 8.2 MySQL管理 \r\n 8.3 使用C语言访问MySQL数据 \r\n 8.4 CD数据库应用程序 \r\n 8.5 小结 \r\n第9章 开发工具 \r\n 9.1 多个源文件带来的问题 \r\n 9.2 make命令和makefile文件 \r\n 9.3 源代码控制 \r\n 9.4 编写使用手册 \r\n 9.5 发行软件 \r\n 9.6 RPM软件包 \r\n 9.7 其他软件包格式 \r\n 9.8 开发环境 \r\n 9.9 小结 \r\n第10章 调试 \r\n 10.1 错误类型 \r\n 10.2 常用调试技巧 \r\n 10.3 使用gdb进行调试 \r\n 10.4 其他调试工具 \r\n 10.5 断言 \r\n 10.6 内存调试 \r\n 10.7 小结 \r\n第11章 进程和信号 \r\n 11.1 什么是进程 \r\n 11.2 进程的结构 \r\n 11.3 启动新进程 \r\n 11.4 信号 \r\n 11.5 小结 \r\n第12章 POSIX线程 \r\n 12.1 什么是线程 \r\n 12.2 第一个线程程序 \r\n 12.3 同时执行 \r\n 12.4 同步 \r\n 12.5 线程的属性 \r\n 12.6 取消一个线程 \r\n 12.7 多线程 \r\n 12.8 小结 \r\n第13章 进程间通信:管道 \r\n 13.1 什么是管道 \r\n 13.2 进程管道 \r\n 13.3 将输出送往popen \r\n 13.4 pipe调用 \r\n 13.5 父进程和子进程 \r\n 13.6 命名管道:FIFO \r\n 13.7 CD数据库应用程序 \r\n 13.8 小结 \r\n第14章 信号量、共享内存和消息队列 \r\n 14.1 信号量 \r\n 14.2 共享内存 \r\n 14.3 消息队列 \r\n 14.4 CD数据库应用程序 \r\n 14.5 IPC状态命令 \r\n 14.6 小结 \r\n第15章 套接字 \r\n 15.1 什么是套接字 \r\n 15.2 套接字连接 \r\n 15.3 网络信息 \r\n 15.4 多客户 \r\n 15.5 数据报 \r\n 15.6 小结 \r\n第16章 用GTK+进行GNOME编程 \r\n 16.1 X窗口系统简介 \r\n 16.2 GTK+简介 \r\n 16.3 事件、信号和回调函数 \r\n 16.4 包装盒 \r\n 16.5 GTK+窗口部件 \r\n 16.6 GNOME窗口部件 \r\n 16.7 GNOME菜单 \r\n 16.8 对话框 \r\n 16.9 CD数据库应用程序 \r\n 16.10 小结 \r\n第17章 用Qt进行KDE编程 \r\n 17.1 KDE和Qt简介 \r\n 17.2 安装Qt \r\n 17.3 信号和槽 \r\n 17.4 Qt 窗口部件 \r\n 17.5 对话框 \r\n 17.6 菜单和工具栏 \r\n 17.7 使用KDE/Qt编写CD数据库应用程序 \r\n 17.8 小结 \r\n第18章 设备驱动程序 \r\n 18.1 编写设备驱动程序 \r\n 18.2 设备 \r\n 18.3 字符设备 \r\n 18.4 字符设备驱动程序示例:schar \r\n 18.5 时间和jiffies \r\n 18.6 内存管理 \r\n 18.7 I/O端口 \r\n 18.8 块设备 \r\n 18.9 调试 \r\n 18.10 可移植性 \r\n 18.11 内核源代码剖析 \r\n 18.12 小结 \r\n第19章 Linux标准 \r\n 19.1 C编程语言 \r\n 19.2 接口和LSB \r\n 19.3 文件系统层次标准 \r\n 19.4 进一步学习标准 \r\n 19.5 小结
本书是学习Linux程序设计的经典著作,适合Linux的初学者以及有一定编程基础且开始利用Linux编程的读者阅读。本书涉及面非常广泛,基本涵盖了Linux程序设计的各个方面,而且讲解简明清晰,切中要害。
本书的第2版在2000年出版,中文版于2002年由机械工业出版社出版,当年就在国内的Linux爱好者和程序员中引起了很大的反响,这一热潮一直持续至今。国内很多大学在开设Linux程序设计课程时都使用本书作为教科书或主要参考书。如今,本书第3版的推出,不仅对原书中内核编程、设备驱动程序、 CVS和GUI开发环境等内容做了大量扩展,而且还增加了介绍MySQL数据库访问和管理、KDE编程、Linux编程标准等新内容。相信本书第3版中译本的出版一定会给读者带来新的感受,并进一步推动国内如火如荼的Linux应用。
作为这一经典著作的翻译者,我们既感到非常荣幸,同时也深感责任重大,在翻译过程中不敢稍有懈怠,除了对原文中的一些错误进行改正,为帮助读者理解,还对一些名词加了译注。但因为本书涉及面广,有些领域也并非我们所擅长,所以译文中错误在所难免。我们真诚希望读者能提出指正意见,以便在本书重印时作出修订。
最后感谢人民邮电出版社的编辑,没有他们始终如一的鼓励和督促,本书是很难翻译完成的。
陈健 宋健建
2007年春于南京大学
Neil Matthew和Richard Stones都是世界知名的Linux/UNIX专家,有数十年Linux/UNIX开发经验和丰富的软件研发从业经历。他们使用过几乎所有UNIX版本,并精通C/C++、LISP、Fortran、Perl、Tcl和Prolog等各种语言。他们从事过各种软件项目,从实时嵌入式系统到会计系统和零售信息系统。除本书外,他们还合著了Professional Linux Programming和PostgreSQL、MySQL方面的著作。
欢迎阅读本书第3版,这是一本针对在Linux系统和其他UNIX风格的操作系统上进行程序开发的易于使用的指南性读物。
在本书中,我们的目标是介绍对于Linux程序员来说非常重要的主题,这些主题的涵盖面非常广泛。书名中的“beginning”更多的是指书中的内容而不是读者的技能。我们对本书的内容组织进行了精心的安排,以帮助读者更多地了解Linux所提供的功能,而不管读者现有的经验有多少。Linux程序设计是一个很大的领域,我们的目标是对广泛领域中的大量主题都进行介绍,从而让读者在每个主题上都能够具备足够的“入门”知识。
读者对象
如果你是一位程序员,希望利用Linux(或UNIX)提供给软件开发者的工具来加快程序开发的进度,尽量减少编程时间并让你的程序充分利用Linux系统所提供的功能,那么本书将非常适用。书中明确清晰的解释和分步骤的实验,将帮助你迅速提高编程能力和掌握所有关键技术。
我们假设读者具备一些C 或C++语言的编程经验,这些经验可能来自Windows系统或其他一些操作系统,但我们会尽量保持书中示例程序简单,即便 你不是一个C语言编程专家,也可以轻松地阅读本书。如果存在需要直接比较Linux程序设计和C/C++程序设计的情况,我们都会在书中指出。
如果你刚开始学习Linux,请注意,这不是一本介绍Linux安装和配置的图书。如果你想多学习一些Linux系统管理方面的知识,请阅读其他的参考书籍,如Mark Sobell的《Red Hat Linux指南》 。
本书的目标是作为一个指南,向读者介绍大多数Linux系统上都有的各种工具和函数/函数库集,同时本书也可以作为一本方便使用的参考手册。本书的特点是简单易懂、内容广泛并且示例丰富。
主要内容
本书希望达到以下几个目标:
□介绍标准Linux C语言函数库和由不同的Linux或UNIX标准指定的其他工具的使用方法。
□介绍如何使用大多数标准Linux开发工具。
□通过DBM和MySQL数据库系统对Linux中的数据存储做出简明的介绍。
□介绍如何为X视窗系统建立图形用户界面。我们将同时使用GTK(GNOME环境的基础)和Qt(KDE环境的基础)函数库。
在给读者打下坚实的基础后,我们将进一步介绍实际的应用程序,这部分内容可能是读者最感兴趣的。
在讨论这些主题时,我们首先介绍编程理论,然后通过适当的例子和清晰的解释来阐明它。通过这种方式,你可以在第一遍的学习中迅速掌握相关知识,如有必要,你还可以回过头来回顾这些内容以复习所有的基本内容。
书中小示例程序的主要设计目的,是演示一组函数的用法或某些新概念的具体实现。贯穿全书有一个大型的示例项目:用于记录音乐CD详细资料的简单的数据库应用程序。随着知识面的扩展,你可以按照你的意愿开发、重新实现和扩展这个项目。虽然如此,这个CD应用程序对本书的任何一章来说都不是必需的,所以只要你愿意就可以忽略它,但我们认为它对将要讨论的技术提供了一些有用的和深入的示范。它提供了一种理想的方式来阐明每个被介绍过的更高级的主题。我们对这个应用程序的第一次讨论出现在本书第2章的结尾处,它展示了一个非常大的shell脚本是如何组织的,shell如何处理用户输入、如何构造菜单以及如何存储和检索数据。
介绍完编译程序、链接函数库和访问在线手册的基本概念后,我们会在shell编程方面稍作停留,然后再全身心投入到C语言程序设计中,讨论的内容包括文件操作、从Linux环境中获取信息、处理终端的输入输出以及curses函数库(它使得交互式的输入和输出更易于管理)。最后我们将用C语言重新实现CD 应用程序。应用程序的设计方法没有变化,但新的代码中将用curses函数库向用户提供一个基于屏幕的用户界面。
接下来讨论数据管理。为了学习dbm数据库函数库的使用方法,我们将再次重新实现这个应用程序,但这次实现所采用的设计方法将贯穿本书后续的一些章节。在其后的一章中,我们将介绍数据是如何使用MySQL存储在一个关系数据库中的,并且我们还将在该章的稍后部分重新使用这种数据存储技术,以让读者了解两种技术的区别。这些新应用程序的规模已经越来越大,这意味着我们接下来需要介绍诸如调试、源代码控制、软件发行和makefile文件等具体内容。
接下来,我们将介绍Linux进程间的通信及其所使用的不同技术,然后看看Linux程序是如何使用套接字来支持在不同机器之间的TCP/IP网络通信的,包括与使用不同处理器架构的机器之间通信的问题。
掌握了Linux程序设计的基础之后,我们开始讨论图形化程序的创建方法。我们将通过两章的内容来介绍它。首先介绍GTK工具包,它是GNOME开发环境的基础;然后介绍Qt工具包,它是KDE开发环境的基础。
在本书最后一个“程序设计”章节中,我们将介绍如何编写设备驱动程序,这是通向理解Linux内核道路上的重要一步。
在本书的最后一章,我们简单介绍了Linux的标准,正是这些标准使得不同Linux厂商的发行版保持了足够的相似性,从而使我们编写的程序可以在不同的Linux发行版上运行。
正如你所期望的,本书还包括许多其他内容,但我们希望这里给出的简单介绍能够让你对将讨论的内容有一个清晰的概念。
准备工作
在本书中,我们向大家介绍的是Linux系统下的程序设计。为了帮助读者更好地理解各章的内容,我们真心希望大家在阅读书中的程序示例时实际运行它,这将提供一个很好的编程实践体验并将鼓励你创建自己的程序。我们希望读者能够将阅读本书和在自己的Linux系统上的实践结合起来。
Linux可以用在许多不同的系统上。其适应性使得只要设备中有一个处理器芯片,Linux就可以以这样或那样的方式在其上运行。目前能够运行Linux 系统的设备包括基于Alpha、SPARC、ARM、PowerPC和68000系列CPU的计算机,以及采用Intel x86/Pentium系列处理器芯片(及其兼容芯片)的现代个人电脑。
我们在编写本书时主要使用的是基于x86的系统,但我们所讨论的内容很少是只适用于Intel芯片的。虽然在一台只有2MB内存且没有硬盘的386机器上运行Linux也是可能的(确实可以),但要想成功地运行Linux并运行本书中的程序示例,我们推荐你使用如Red Hat、Debian或SuSE这样的流行Linux发行版并采用它们所推荐的硬件配置。
我们使用两台不同配置的Linux系统来编写本书并开发书中的程序示例,所以可以确信只要你的机器可以运行Linux,你就可以顺利地完成本书的学习。此外,在本书的技术审核阶段,我们还在其他版本的Linux系统中测试了书中的全部代码。
出于软件开发的需求,我们建议读者使用最新版本的Linux发行版。虽然我们也可以从零开始构建一个Linux系统,但如果从一个预先包装好的Linux 版本开始将会更容易,许多Linux发行版本厂商现在都提供了在线升级服务,以保证Linux组件版本的更新和错误的修复。对于大多数用户来说,运行这样的Linux系统是一个好主意。
因为Linux、GNU工具包和其他软件都是在GPL许可规定下发行的,所以它们都有一些确定的特性,其中之一就是“自由”。它们的源代码永远是公开的,任何人都不能将它据为己有。因此它们都是一些开源软件,有些软件在服从特定条件的情况下也会提供源代码,但“开源软件”这个术语的含义要比这些软件更宽一些,更详细的信息请http://www.opensource.org/。对于GNU/Linux,你总是可以获得技术支持,你可以自己研究源代码,也可以雇用其他人。目前有越来越多的公司提供针对Linux和相关工具的收费技术支持。
源代码
我们尽力向读者提供能够最好地阐明书中讨论的概念的示例程序和代码片断。需要指出的是,为了尽可能地解释清楚书中介绍的新功能,我们将自由采用一种或两种代码风格。
特别要指出的是,我们并未总是对调用的每个函数的返回值进行检查,以判断它是否与我们预期的一样。在真正的应用程序代码中,我们肯定要做这样的检查工作,而读者也应该对错误处理采取严格的措施。(本书的第3章将讨论一些捕获和处理错误的方法。)
本书所有的源代码都可以http://www.wrox.com 上下载。
书中的所有源代码都遵守GNU(通用公共许可证)的条款,该许可证的网址http://www.gnu.org/ licenses/gpl.txt。下面的许可说明将应用于本书所有的源代码:
虽然你需要的所有代码都已在书中列出,我们还是建议你下载一份代码拷贝以节省输入时间。
本书约定
为了帮助读者从书中学到更多的知识和跟上书中论述的内容,我们将贯穿全书使用以下一些约定。
书中像这样的文字框中记录的是一些重要的、不应该被忘记的、非常关键的信息。它们与周边的内容直接相关。
进行介绍时,我们将把一些重要的单词用楷体显示,需要读者输入的字符用黑体显示。组合键的显示格式为:Ctrl+A。
我们使用三种不同的方式来显示代码:
当显示命令行时,它使用的是上述风格,输出结果的风格也如上所示。字符$是提示符(如果命令需要超级用户来执行,则提示符会用字符#来替代),黑体字的文本是需要读者输入的命令,然后按下回车键执行该命令。其后采用相同字体
无封面