Linux 应用程序开发

Linux 应用程序开发
作 者: 约翰逊 特罗安 武延军 郭松柳
出版社: 电子工业出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: Linux操作系统 程序设计
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  MichaelK.Johson是Specifix的操作系统工程师。他曾是RedHat的操作系统开发人员,在那里他管理一个内核开发小组长达3年半,是Fedora项目基础技术的领导。他也曾做过有关Linux应用程序开发的全日制的教学工作。ErikW.Troan是Specifix的操作系统的合伙创始人和执行副总裁。他曾经是RedHat产品工程部的副总裁,负责规格描述和创建技术,例如RPM、Linux操作系统,RedHat网络、高性能服务器以及RedHat网站的基础设施。

内容简介

本书介绍了Linux环境下进行应用程序开发需要掌握的知识,对许多编程实践中经常遇到的内容进行了详细的讲解,并且提供了典型的实例加以说明。 全书分为四个部分。第1部分是初学者需要了解的知识,包括Linux的历史、从事自由软件开发需要了解的版权知识和GPL等许可证,以及如何获取和使用在线文档系统。第2部分介绍了开发环境和工具。其中包括Vi,emacs编辑器,gdb调试器的使用,gcc的选项和扩展,GNU C库的基本知识,内存溢出和泄漏的调试工具,如何创建、使用、管理静态库和动态库,以及如何通过系统调用请求系统服务。第3部分详细介绍了Linux系统编程知识。其中包括进程模型,简单文件管理,信号处理,高级文件操作,目录操作,作业控制,终端与伪终端,socket网络,时I司和定时器,随机数,虚拟控制台,Linux控制台,以及如何编写安全的程序。第4部分精选了Linux编程中最常用的开发库进行介绍。其中包括字符串匹配,用于终端编程的S-lang库,基于散列的数据库函数库,命令行解析库,如何运行时动态加载共享对象,以及有关用户身份识别和验证的库。 本书内容丰富、实用,语言通俗,不仅适合初学者学习,也适合熟悉Unix环境编程的高级开发人员参考。

图书目录

第1部分 起步

第1章 Linux的发展历史 2

1.1 自由Unix软件简史 3

1.2 Linux的发展 4

1.3 Unix系统的概念谱系 5

1.4 Linux谱系 7

第2章 许可证和版权 8

2.1 版权 8

2.2 许可 10

2.3 自由软件许可证 10

2.3.1 GNU通用公共许可证 11

2.3.2 GNU库通用公共许可证 12

2.3.3 MIT/X/BSD风格的许可证 12

2.3.4 旧BSD风格的许可证 12

2.3.5 艺术许可证 12

2.3.6 许可证的不兼容性 13

第3章 在线系统文档 14

3.1 man手册页 14

3.2 info手册页 15

3.3 其他文档 15

第2部分 开发工具和环境

第4章 开发工具 18

4.1 编辑器 19

4.1.1 Emacs 20

4.1.2 vi 21

4.2 Make 21

4.2.1 复杂命令行 24

4.2.2 变量 25

4.2.3 后缀规则 26

4.3 GNU的调试器 27

4.4 跟踪程序行为 31

第5章 gcc的选项和扩展 33

5.1 gcc选项 33

5.2 头文件 36

5.2.1 long long 36

5.2.2 内嵌函数 36

5.2.3 可选择的扩展关键字 36

5.2.4 特征 37

第6章 GNC的C语言库 38

6.1 特征选择 38

6.2 POSIX接口 40

6.2.1 POSIX要求的类型 40

6.2.2 发现运行时的权能 42

6.2.3 查找和设置基本系统信息 43

6.3 兼容性 45

第7章 内存调试工具 46

7.1 存在Bug的代码 46

7.2 glibc的内存检查工具 48

7.2.1 发现内存堆的损坏 49

7.2.2 使用mtrace()来跟踪分配情况 52

7.3 利用mpr找到内存泄露 53

7.4 利用valgrind发现内存错误 55

7.5 电网 60

7.5.1 使用电网 61

7.5.2 内存对齐 61

7.5.3 其他特性 63

7.5.4 局限性 63

7.5.5 资源消耗 63

第8章 创建和使用库 65

8.1 静态库 65

8.2 共享库 66

8.3 设计共享库 67

8.3.1 管理兼容性 67

8.3.2 不兼容的库 68

8.3.3 设计兼容的库 68

8.4 构造共享库 69

8.5 安装共享库 70

例子 71

8.6 使用共享库 72

8.6.1 使用无须安装的库 73

8.6.2 提前装载库 73

第9章 Linux系统环境 75

9.1 进程环境 75

9.2 理解系统调用 76

9.2.1 系统调用的限制 77

9.2.2 系统调用的返回码 77

9.2.3 使用系统调用 79

9.2.4 通用错误返回码 80

9.3 查找头文件和库文件 85

第3部分 系统编程

第10章 进程模型 88

10.1 定义进程 88

10.1.1 使用线程的复杂性 88

10.1.2 Linux的方式 89

10.2 进程属性 89

10.2.1 pid及其生成 89

10.2.2 信用状 90

10.2.3 文件系统用户标识符 94

10.2.4 关于uid和gid的总结 95

10.3 进程信息 96

10.3.1 程序参数 97

10.3.2 资源的使用 98

10.3.3 建立使用限制 100

10.4 进程基本元素 101

10.4.1 创建子进程 102

10.4.2 等待子进程结束 103

10.4.3 运行新程序 104

10.4.4 用vfork()更快速地创建进程 106

10.4.5 自我终止 107

10.4.6 终止其他进程 107

10.4.7 转储内核文件信息 109

10.5 简单子进程 109

10.5.1 用system()运行和等待 109

10.5.2 从进程读或写 110

10.6 会话和进程组 112

10.6.1 会话 113

10.6.2 控制终端 113

10.6.3 进程组 113

10.6.4 孤儿进程组 114

10.7 介绍ladsh 115

用ladsh运行外部程序 116

10.8 创建克隆 129

第11章 简单的文件管理 130

11.1 文件模式 132

11.1.1 文件访问权限 133

11.1.2 文件权限修饰符 134

11.1.3 文件类型 136

11.1.4 进程的umask 137

11.2 基本的文件操作 138

11.2.1 文件描述符 138

11.2.2 关闭文件 139

11.2.3 在文件系统中打开文件 139

11.2.4 文件的读、写以及位置

11.2.4 指针的移动 141

11.2.5 局部读和写 145

11.2.6 缩短文件 147

11.2.7 同步文件 147

11.2.8 其他操作 148

11.3 查询和修改Inode信息 149

11.3.1 查找Inode信息 149

11.3.2 一个使用stat()的简单示例 150

11.3.3 轻松确定访问权限 152

11.3.4 改变文件的访问权限 153

11.3.5 改变文件的所有者和组 153

11.3.6 改变文件的时间戳 154

11.3.7 Ext3扩展属性 155

11.4 操作目录项 159

11.4.1 创建设备文件以及命名管道的目录项 160

11.4.2 创建硬链接 162

11.4.3 使用符号链接 163

11.4.4 删除文件 164

11.4.5 重命名文件 164

11.5 操作文件描述符 165

11.5.1 改变打开文件的访问模式 165

11.5.2 修改close-on-exec标志 166

11.5.3 复制文件描述符 166

11.6 创建无名管道 167

11.7 对ladsh添加重定向 168

11.7.1 数据结构 168

11.7.2 修改代码 169

第12章 信号处理 172

12.1 信号的概念 173

12.1.1 信号的生命周期 173

12.1.2 简单信号 173

12.1.3 可靠信号 175

12.1.4 信号和系统调用 176

12.2 Linux(和POSIX)信号系统的API 177

12.2.1 发送信号 177

12.2.2 使用sigset_t 178

12.2.3 捕捉信号 178

12.2.4 操作一个进程的信号掩码 180

12.2.5 找到等待信号的集合 182

12.2.6 等待信号 182

12.3 有效信号 183

描述信号 187

12.4 编写信号处理程序 188

12.5 重新打开日志文件 190

12.6 实时信号 193

信号队列和排序 193

12.7 获取信号的信息 196

12.7.1 得到一个信号的上下文 196

12.7.2 使用信号发送数据 202

第13章 高级文件操作 205

13.1 多路输入输出 205

13.1.1 非阻塞I/O 208

13.1.2 用poll()的多路传输 209

13.1.3 使用select()的多路传输 213

13.1.4 比较poll()和select() 217

13.1.5 使用epoll进行多路传输 220

13.1.6 比较poll()和epoll 225

13.2 内存映射 229

13.2.1 页对齐 230

13.2.2 建立内存映射 230

13.2.3 撤销映射区域 235

13.2.4 同步内存区域到磁盘 235

13.2.5 锁定内存区域 236

13.3 文件锁定 237

13.3.1 文件锁 238

13.3.2 记录锁 239

13.3.3 强制锁 245

13.3.4 租赁文件 245

13.4 read()和write()的替代方法 249

13.4.1 分散/聚集的读和写 249

13.4.2 忽略文件指针 251

第14章 目录操作 253

14.1 当前工作目录 253

14.1.1 查找当前工作目录 253

14.1.2 特殊文件“.”和“..” 255

14.1.3 当前目录 255

14.2 改变根目录 256

14.3 创建和删除目录 256

14.3.1 创建新目录 256

14.3.2 删除目录 257

14.4 读取目录的内容 257

再次读取目录内容 259

14.5 文件名匹配搜索 259

14.5.1 使用子进程 260

14.5.2 内在匹配搜索 261

14.6 为ladsh增加目录和匹配功能 265

14.6.1 增加cd和pwd 266

14.6.2 增加文件名匹配查询 267

14.7 遍历文件系统的树结构 270

14.7.1 使用ftw() 270

14.7.2 用nftw()函数进行文件树遍历 272

14.7.3 实现find功能 274

14.8 目录变更提示 276

第15章 作业控制 284

15.1 作业控制基础 284

15.1.1 重新启动进程 284

15.1.2 停止进程 285

15.1.3 处理作业控制信号 285

15.2 ladsh中的作业控制 287

第16章 终端与伪终端 293

16.1 tty操作 294

16.1.1 终端实用函数 294

16.1.2 控制终端 295

16.1.3 终端所有权 296

16.1.4 用utemper工具进行记录 297

16.1.5 手工记录 298

16.2 termios概述 308

16.3 termios实例 309

16.3.1 密码 309

16.3.2 串行通信 311

16.4 termios调试 325

16.5 termios参考 326

16.5.1 函数 327

16.5.2 窗口尺寸 330

16.5.3 标志位 331

16.5.4 输入模式标记 332

16.5.5 输出模式标记 334

16.5.6 控制模式标记 335

16.5.7 控制模式字符 336

16.5.8 本地模式标记 338

16.5.9 控制read() 340

16.6 伪终端 341

16.6.1 打开伪终端 342

16.6.2 打开伪终端的简单方法 343

16.6.3 打开伪终端的复杂方法 344

16.6.4 伪终端范例 348

第17章 socket网络 358

17.1 协议支持 358

17.1.1 理想的网络 358

17.1.2 实际的网络 359

17.1.3 让实际的网络变得理想 360

17.1.4 地址 360

17.2 实用函数 361

17.3 基本套接字操作 362

17.3.1 建立一个套接字 362

17.3.2 建立连接 364

17.3.3 将地址绑定到套接字 364

17.3.4 等待连接 364

17.3.5 连接到一个服务器 365

17.3.6 找到连接地址 366

17.4 Unix域套接字 367

17.4.1 Unix域地址 367

17.4.2 等待一个连接 368

17.4.3 连接到一个服务器 370

17.4.4 运行Unix域的示例 371

17.4.5 未命名的Unix域套接字 371

17.4.6 传递文件描述符 372

17.5 基于TCP/IP协议的联网机器 377

17.5.1 字节存储顺序 377

17.5.2 IPv4地址 378

17.5.3 IPv6地址 380

17.5.4 IP地址的操作 382

17.5.5 转换名称到地址 384

17.5.6 转换地址到名称 395

17.5.7 监听TCP连接 400

17.5.8 TCP客户端应用程序 403

17.6 使用UDP数据报 404

17.6.1 创建一个UDP套接字 405

17.6.2 发送和接收数据报 406

17.6.3 一个简单的tftp服务器 407

17.7 套接字错误 413

17.8 旧的网络函数 415

17.8.1 IPv4地址操作 415

17.8.2 主机名解析 417

17.8.3 旧的主机信息查找范例 418

17.8.4 查找端口号 420

第18章 时间 423

18.1 获取时间和日期 423

18.1.1 时间和日期的表示 423

18.1.2 时间的转换,格式化和解析 426

18.1.3 时间的限制 429

18.2 使用计时器 431

18.2.1 休眠 431

18.2.2 间隔计时器 432

第19章 随机数 436

19.1 伪随机数 436

19.2 密码系统和随机数 437

第20章 虚拟控制台编程 439

20.1 起步 440

20.2 发出峰鸣声 442

20.3 判断终端是否为虚拟控制台 443

20.4 查找当前虚拟控制台 443

20.5 管理虚拟控制台的切换 444

20.6 范例:open命令 447

第21章 Linux控制台 449

21.1 权能数据库 450

21.2 图标,字符和映射 451

21.3 Linux控制台权能 452

21.3.1 控制字符 453

21.3.2 转义字符序列 454

21.3.3 测试序列 455

21.3.4 复杂转义字符序列 456

21.4 直接写屏幕 461

第22章 编写安全程序 464

22.1 安全何时重要 464

安全何时失效 465

22.2 最小化攻击时机 466

22.2.1 放弃权限 466

22.2.2 采用辅助手段 467

22.2.3 限制文件系统的访问 468

22.3 常见的安全漏洞 469

22.3.1 缓冲区溢出 469

22.3.2 解析文件名 474

22.3.3 环境变量 474

22.3.4 运行Shell 475

22.3.5 创建临时文件 476

22.3.6 竞争状态和信号处理 478

22.3.7 关闭文件描述符 478

22.4 作为守护进程运行 479

第4部分 开发库

第23章 字符串的匹配 482

23.1 匹配任意字符串 482

23.2 正则表达式 483

23.2.1 Linux正则表达式 483

23.2.2 正则表达式的匹配 484

23.2.3 一个简单的grep示例 489

第24章 用S-Lang来处理终端 495

24.1 输入处理 495

24.1.1 初始化S-Lang的输入处理 496

24.1.2 恢复终端状态 497

24.1.3 从终端读取字符 497

24.1.4 检查未决的输入 498

24.2 输出处理 498

24.2.1 初始化屏幕管理 499

24.2.2 更新显示 499

24.2.3 移动光标 499

24.2.4 结束屏幕管理 500

24.2.5 屏幕管理的框架程序 500

24.2.6 切换字符集 501

24.2.7 输出到屏幕 502

24.2.8 画线和画矩形 503

24.2.9 使用颜色 505

第25章 基于散列的数据库函数库 508

25.1 概述 508

25.2 基本操作 509

25.2.1 打开qdbm文件 509

25.2.2 关闭数据库 510

25.2.3 获得文件描述符 511

25.2.4 同步数据库 511

25.3 读取记录 512

25.3.1 读取特定的记录 512

25.3.2 顺序读取记录 513

25.4 修改数据库 513

25.4.1 增加记录 513

25.4.2 删除记录 514

25.5 实例 514

第26章 解析命令行选项 521

26.1 选项表 522

26.1.1 定义选项 522

26.1.2 嵌套选项表 525

26.2 使用选项表 526

26.2.1 创建上下文 526

26.2.2 解析命令行 527

26.2.3 剩余的参数 528

26.2.4 自动帮助信息 528

26.3 使用回调(callback) 531

26.4 错误处理 534

26.5 选项别名 536

26.5.1 指定别名 536

26.5.2 使别名生效 537

26.6 解析参数字符串 538

26.7 处理额外参数 538

26.8 应用程序示例 538

第27章 运行时动态加载 540

动态加载接口 541

示例 544

第28章 用户识别和验证 546

28.1 ID到名字的转换 546

示例:id命令 549

28.2 可挂接的认证模块 552

28.2.1 PAM 会话 553

28.2.2 PAM操作 555

附 录

附录A 头文件 564

附录B ladsh源文件 565

词汇表 584

参考文献 593

索引 597