这书详尽论述了怎样撰写与Linux核心及其关键系统软件库出示的服务项目立即有关的手机软件。在这里这书中,Linux核心推动者Robert Love全方位论述了Linux系统软件程序编写,具体指导怎样开展Linux系统调用,并从权威专家视角剖析怎样撰写更雅致、运作迅速的编码。
这书创作者对POSIX规范涵数和Linux出示的某些特殊服务项目十分掌握。这书第2版增加了章节专业详细介绍多核,它是对第1版的升级和拓展,一起这书从基础理论和运用视角详细分析Linux,涉及到的程序编写主题风格很广,包含下列精彩文章:
1. Linux核心、C库和Cc语言编译器概览;
2. 基本I/O实际操作,如文档读写能力;
3. 高級I/O插口、运行内存投射及其开发技术;
4. 有关基础流程管理的系统调用;
5. 高級进程管理,包含即时系统进程;
6. 进程定义,多线程编程和Pthreads;
7. 文档和文件目录管理方法;
8. 运行内存分派和提升运行内存浏览有关的插口;
9. 基础的和高級的数据信号插口,以及在系统软件中的功效;
10. 数字时钟管理方法,包含POSIX数字时钟和高精记时器。
系统软件程序编写就是指撰写操作系统,其编码在最底层运作,立即跟核心和关键系统软件库会话。《Linux系统软件程序编写(第2版)》是1本有关Linux系统软件程序编写的实例教程,都是1本详细介绍Linux系统软件程序编写的指南,還是1本怎样保持更雅致迅速编码的内情手册。全书分成11章和2个附则,详解了Linux系统软件程序编写基本要素、文档I/O、缓存I/O、高級文档I/O、进程管理、高級进程管理、进程、文档和文件目录管理方法、数据信号和時间等主题风格。附则得出了gcc和GNU C出示的许多語言拓展,及其阅读推荐的有关推荐书目。《Linux系统软件程序编写(第2版)》的创作者是著名的Linux核心权威专家,多本热销技术性书籍的创作者。《Linux系统软件程序编写(第2版)》必须在C程序编写和Linux程序编写自然环境下工作中的程序猿阅读文章,针对愿意推进基本或掌握核心的高級软件程序员,《Linux系统软件程序编写(第2版)》也很有实用价值。
目录
- 第1章 入门和基本概念
- 1.1 系统编程
- 1.1.1 为什么要学习系统编程
- 1.1.2 系统编程的基础
- 1.1.3 系统调用
- 1.1.4 C库
- 1.1.5 C编译器
- 1.2 API和ABI
- 1.2.1 API
- 1.2.2 ABI
- 1.3 标准
- 1.3.1 POSIX和SUS的历史
- 1.3.2 C语言标准
- 1.3.3 Linux和标准
- 1.3.4 本书和标准
- 1.4 Linux编程的概念
- 1.4.1 文件和文件系统
- 1.4.2 进程
- 1.4.3 用户和组
- 1.4.4 权限
- 1.4.5 信号
- 1.4.6 进程间通信
- 1.4.7 头文件
- 1.4.8 错误处理
- 第2章 文件I/O
- 2.1 打开文件
- 2.1.1 系统调用open()
- 2.1.2 新建文件的所有者
- 2.1.3 新建文件的权限
- 2.1.4 creat()函数
- 2.1.5 返回值和错误码
- 2.2 通过read()读文件
- 2.2.1 返回值
- 2.2.2 读入所有字节
- 2.2.3 非阻塞读
- 2.2.4 其他错误码
- 2.2.5 read()调用的大小限制
- 2.3 调用write()写
- 2.3.1 部分写(Partial Write)
- 2.3.2 Append(追加)模式
- 2.3.3 非阻塞写
- 2.3.4 其他错误码
- 2.3.5 write()大小限制
- 2.3.6 write()行为
- 2.4 同步I/O
- 2.4.1 fsync()和fdatasync()
- 2.4.2 sync()
- 2.4.3 O_SYNC标志位
- 2.4.4 O_DSYNC和O_RSYNC
- 2.5 直接I/O
- 2.6 关闭文件
- 2.7 用lseek()查找
- 2.7.1 在文件末尾后查找
- 2.7.2 错误码
- 2.7.3 限制
- 2.8 定位读写
- 2.9 文件截短
- 2.10 I/O多路复用
- 2.10.1 select()
- 2.10.2 poll()
- 2.10.3 poll()和select()的区别
- 2.11 内核内幕
- 2.11.1 虚拟文件系统
- 2.11.2 页缓存
- 2.11.3 页回写
- 2.12 结束语
- 第3章 缓冲I/O
- 3.1 用户缓冲I/O
- 3.2 标准I/O
- 3.3 打开文件
- 3.4 通过文件描述符打开流
- 3.5 关闭流
- 3.6 从流中读数据
- 3.6.1 每次读取一个字节
- 3.6.2 每次读一行
- 3.6.3 读二进制文件
- 3.7 向流中写数据
- 3.7.1 写入单个字符
- 3.7.2 写入字符串
- 3.7.3 写入二进制数据
- 3.8 缓冲I/O示例程序
- 3.9 定位流
- 3.10 Flush(刷新输出)流
- 3.11 错误和文件结束
- 3.12 获取关联的文件描述符
- 3.13 控制缓冲
- 3.14 线程安全
- 3.14.1 手动文件加锁
- 3.14.2 对流操作解锁
- 3.15 对标准I/O的批评
- 3.16 结束语
- 第4章 高级文件I/O
- 4.1 分散/聚集I/O
- 4.2 Event Poll
- 4.2.1 创建新的epoll实例
- 4.2.2 控制epoll
- 4.2.3 等待epoll事件
- 4.2.4 边缘触发事件和条件触发事件
- 4.3 存储映射
- 4.3.1 mmap()
- 4.3.2 munmap()
- 4.3.3 存储映射实例
- 4.3.4 mmap()的优点
- 4.3.5 mmap()的不足
- 4.3.6 调整映射的大小
- 4.3.7 改变映射区域的权限
- 4.3.8 通过映射同步文件
- 4.3.9 给出映射提示
- 4.4 普通文件I/O提示
- 4.4.1 系统调用posix_fadvise()
- 4.4.2 readahead()系统调用
- 4.4.3 “经济实用”的操作提示
- 4.5 同步(Synchronized),同步(Synchronous)及异步(Asynchronous)操作
- 4.6 I/O调度器和I/O性能
- 4.6.1 磁盘寻址
- 4.6.2 I/O调度器的功能
- 4.6.3 改进读请求
- 4.6.4 选择和配置你的I/O调度器
- 4.6.5 优化I/O性能
- 4.7 结束语
- 第5章 进程管理
- 5.1 程序、进程和线程
- 5.2 进程ID
- 5.2.1 分配进程ID
- 5.2.2 进程体系
- 5.2.3 pid_t
- 5.2.4 获取进程ID和父进程ID
- 5.3 运行新进程
- 5.3.1 exec系统调用
- 5.3.2 fork()系统调用
- 5.4 终止进程
- 5.4.1 终止进程的其他方式
- 5.4.2 atexit()
- 5.4.3 on_exit()
- 5.4.4 SIGCHLD
- 5.5 等待子进程终止
- 5.5.1 等待特定进程
- 5.5.2 等待子进程的其他方法
- 5.5.3 BSD中的wait3()和wait4()
- 5.5.4 创建并等待新进程
- 5.5.5 僵尸进程
- 5.6 用户和组
- 5.6.1 改变实际用户/组ID和保留的用户/组ID
- 5.6.2 改变有效的用户ID或组ID
- 5.6.3 BSD改变用户ID和组ID的方式
- 5.6.4 HP-UX中改变用户ID和组ID的方式
- 5.6.5 操作用户ID/组ID的首选方法
- 5.6.6 对保留的用户ID的支持
- 5.6.7 获取用户ID和组ID
- 5.7 会话(Session)和进程组
- 5.7.1 与会话相关的系统调用
- 5.7.2 与进程组相关的系统调用
- 5.7.3 废弃的进程组函数
- 5.8 守护进程
- 5.9 结束语
- 第6章 高级进程管理
- 6.1 进程调度
- 6.1.1 时间片
- 6.1.2 I/O约束型进程和处理器约束型进程
- 6.1.3 抢占式调度
- 6.2 完全公平调度器
- 6.3 让出处理器
- 6.4 进程优先级
- 6.4.1 nice()
- 6.4.2 getpriority()和setpriority()
- 6.4.3 I/O优先级
- 6.5 处理器亲和力(Affinity)
- 6.6 实时系统
- 6.6.1 硬实时系统和软实时系统
- 6.6.2 延迟、抖动和截止期限
- 6.6.3 Linux的实时支持
- 6.6.4 Linux调度策略和优先级
- 6.6.5 设置调度参数
- 6.6.6 sched_rr_get_interval()
- 6.6.7 关于实时进程的注意事项
- 6.6.8 确定性
- 6.7 资源限制
- 6.7.1 限制项
- 6.7.2 获取和设置资源限制
- 第7章 线程
- 7.1 二进制程序、进程和线程
- 7.2 多线程
- 7.2.1 多线程代价
- 7.2.2 其他选择
- 7.3 线程模型
- 7.3.1 用户级线程模型
- 7.3.2 混合式线程模型
- 7.3.3 协同程序
- 7.4 线程模式
- 7.4.1 每个连接对应一个线程
- 7.4.2 事件驱动的线程模式
- 7.5 并发性、并行性和竞争
- 7.6 同步
- 7.6.1 互斥
- 7.6.2 死锁
- 7.7 Pthreads
- 7.7.1 Linux线程实现
- 7.7.2 Pthread API
- 7.7.3 链接Pthreads
- 7.7.4 创建线程
- 7.7.5 线程ID
- 7.7.6 终止线程
- 7.7.7 join(加入)线程和detach(分离)线程
- 7.7.8 线程编码实例
- 7.7.9 Pthread互斥
- 7.8 进一步研究
- 第8章 文件和目录管理
- 8.1 文件及其元数据
- 8.1.1 一组stat函数
- 8.1.2 权限
- 8.1.3 所有权
- 8.1.4 扩展属性
- 8.1.5 扩展属性操作
- 8.2 目录
- 8.2.1 获取当前工作目录
- 8.2.2 创建目录
- 8.2.3 删除目录
- 8.2.4 读取目录内容
- 8.3 链接
- 8.3.1 硬链接
- 8.3.2 符号链接
- 8.3.3 解除链接
- 8.4 拷贝和移动文件
- 8.4.1 拷贝
- 8.4.2 移动
- 8.5 设备节点
- 8.5.1 特殊设备节点
- 8.5.2 随机数生成器
- 8.6 带外通信(Out-of-Band Communication)
- 8.7 监视文件事件
- 8.7.1 初始化inotify
- 8.7.2 监视
- 8.7.3 inotify事件
- 8.7.4 高级监视选项
- 8.7.5 删除inotify监视
- 8.7.6 获取事件队列大小
- 8.7.7 销毁inotify实例
- 第9章 内存管理
- 9.1 进程地址空间
- 9.1.1 页和页面调度
- 9.1.2 内存区域
- 9.2 动态内存分配
- 9.2.1 数组分配
- 9.2.2 调整已分配内存大小
- 9.2.3 释放动态内存
- 9.2.4 对齐
- 9.3 数据段的管理
- 9.4 匿名内存映射
- 9.4.1 创建匿名内存映射
- 9.4.2 映射到设备文件/dev/zero
- 9.5 高级内存分配
- 9.5.1 调试内存分配
- 9.5.2 获取统计信息
- 9.6 基于栈的分配
- 9.6.1 把字符串复制到栈中
- 9.6.2 变长数组
- 9.7 选择合适的内存分配机制
- 9.8 内存操作
- 9.8.1 字节设置
- 9.8.2 字节比较
- 9.8.3 字节移动
- 9.8.4 字节查找
- 9.8.5 字节加密
- 9.9 内存锁定
- 9.9.1 锁定部分地址空间
- 9.9.2 锁定全部地址空间
- 9.9.3 内存解锁
- 9.9.4 锁的限制
- 9.9.5 该页在物理内存中吗
- 9.10 投机性内存分配策略
- 第10章 信号
- 10.1 信号相关的概念
- 10.1.1 信号标识符
- 10.1.2 Linux支持的信号
- 10.2 基本信号管理
- 10.2.1 等待信号
- 10.2.2 示例
- 10.2.3 执行和继承
- 10.2.4 把信号编号映射为字符串
- 10.3 发送信号
- 10.3.1 权限
- 10.3.2 示例
- 10.3.3 给进程本身发送信号
- 10.3.4 给整个进程组发送信号
- 10.4 重入
- 10.5 信号集
- 10.5.1 更多的信号集函数
- 10.5.2 获取待处理信号
- 10.5.3 等待信号集
- 10.6 高级信号管理
- 10.6.1 结构体siginfo_t
- 10.6.2 si_code的相关说明
- 10.6.3 发送带附加信息(payload)的信号
- 10.6.4 示例
- 10.7 信号是个UNIX“瑕疵”吗
- 第11章 时间
- 11.1 时间的数据结构
- 11.1.1 原始表示
- 11.1.2 微秒级精度
- 11.1.3 更精确的:纳秒级精度
- 11.1.4 对时间进行分解
- 11.1.5 进程时间类型
- 11.2 POSIX时钟
- 11.3 时间源精度
- 11.4 取得当前时间
- 11.4.1 更好的接口
- 11.4.2 高级接口
- 11.4.3 获取进程时间
- 11.5 设置当前时间
- 11.5.1 设置支持高精度的时间
- 11.5.2 设置时间的高级接口
- 11.6 玩转时间
- 11.7 睡眠和等待
- 11.7.1 以微秒级精度睡眠
- 11.7.2 以纳秒级精度睡眠
- 11.7.3 实现睡眠的高级方法
- 11.7.4 sleep的可移植实现
- 11.7.5 超时(Overrun)
- 11.7.6 睡眠的其他方式
- 11.8 定时器
- 11.8.1 简单的闹钟
- 11.8.2 计时器(interval timer)
- 11.8.3 高级定时器
- 附录A C语言的GCC扩展
- 附录B 参考书目