
最 低 价:¥44.30
| “本书的第一版总是放在我桌上举手可及的地方,因为它非常好地解释了Linux用户态API的所有领域。而第二版更为出色,我即将用它来取代第一版。” Greg Kroah-Hartman 著名的Linux内核程序员 《Linux应用程序开发(第二版)》是一本出色的参考书籍,适合各个层次的Linux程序员,也包括从其他操作系统转行的C程序员。在备受好评的第一版的基础上,Linux程序员的两位领军人物,Michael K.Johnson和Erik W.Troan系统地介绍了创建鲁棒的、安全的、高效的软件,以及移植现有代码到Linux所发掌握的关健API和技术。 本书针对Linux2.6内核、GNU C库2.3版、最新的POSIX标准,以及单一Unix规范第6期,在第一版的基础上做了全部的更正。它覆盖了Linux所特有的扩展和特性,帮助你最大程度地发挥当今Linux的强大功能。同时,其他开发人员可分享作者在从事最新的Liunx发行版的工作中所获得的思想、技巧、窍门。另外,这些更正也适用于任何版本的Unix。 涉及主题: ·Linux开发:理解什么是操作系统、许可以及文档。 ·开发环境:编译器、链接器和装载器、以及调试工具。 ·系统编程:进程模型、文件处理、信号处理、目录操作以及作业控制。 ·终端、socker、定时器、虚拟终端、Linux控制台。 ·开发库:字符串匹配、终端处理、命令行解析、认证以及其他。 ·大量的可下载的代码范例。 本版新内容: ·GNU C库(glibc),底层的标准,一些测试用的宏。 ·编写安全的Linux程序,系统守护进程,实用程序。 ·对内存调试的范围进行了重要的扩展,包括Valgrind和mpr。 ·对涉及正则表达式的部分进行了重要改进。 ·涵盖了IPv6网络,包括IPv6和IPv4交互使用的新系统库接口。 ·涵盖了strace,itrace,实时信号,poll和epoll系统调用,popl库改进,可挂接认证模块(PAM),qdbm等。 ·改进了索引和词汇表,并且对示例代码加上了行号。 |
| Michael K.Johnson是Specifix的操作系统工程师。他曾是RedHat的操作系统开发人员,在那里他管理一个内核开发小组长达3年半,是Fedora项目基础技术的领导。他也曾做过有关Linux应用程序开发的全日制的教学工作。. Erik W.Troan是Specifix的操作系统的合伙创始人和执行副总裁。他曾经是Red Hat产品工程部的副总裁,负责规格描述和创建技术,例如RPM、Linux操作系统、Red Hat网络、高性能服务器以及Red Hat网站的基础设施。... .. << 查看详细 |
| 第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 emacs20 4.1.2 vi21 4.2 make21 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 long36 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 介绍ladsh115 用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 进程的umask137 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)信号系统的api177 12.2.1 发送信号177 12.2.2 使用sigset_t178 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/o208 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()和epoll225 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和pwd266 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 运行shell475 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 |
商品评论(0条)