欢迎访问学兔兔,学习、交流 分享 !

返回首页 |

Linux环境编程 从应用到内核 高峰,李彬编著 2016年版

收藏
  • 大小:100 MB
  • 语言:中文版
  • 格式: PDF文档
  • 阅读软件: Adobe Reader
资源简介
Linux环境编程 从应用到内核
作者:高峰,李彬编著
出版时间: 2016年版
内容简介
  本书将按照APUE的脉络,以笔者多年的Linux开发经验为基础,从以下四个方面深入讲解Linux环境编程:接口的功能使用介绍、接口缺陷分析、接口的内部实现机制、接口的错误码分析。本书将从一个全新的角度带领读者重新进入Linux环境编程,从应用出发,深入内核源码,研究Linux各接口的工作机制和原理。让读者不仅知其然,还知其所以然。
目录
目  录 Contents前 言第0章 基础知识10.1 一个Linux程序的诞生记10.2 程序的构成20.3 程序是如何“跑”的40.4 背景概念介绍50.4.1 系统调用50.4.2 C库函数60.4.3 线程安全70.4.4 原子性90.4.5 可重入函数90.4.6 阻塞与非阻塞110.4.7 同步与非同步11第1章 文件I/O121.1 Linux中的文件121.1.1 文件、文件描述符和文件表121.1.2 内核文件表的实现131.2 打开文件141.2.1 open介绍141.2.2 更多选项151.2.3 open源码跟踪161.2.4 如何选择文件描述符171.2.5 文件描述符fd与文件管理结构file181.3 creat简介191.4 关闭文件191.4.1 close介绍191.4.2 close源码跟踪191.4.3 自定义files_operations211.4.4 遗忘close造成的问题221.4.5 如何查找文件资源泄漏251.5 文件偏移261.5.1 lseek简介261.5.2 小心lseek的返回值261.5.3 lseek源码分析271.6 读取文件291.6.1 read源码跟踪291.6.2 部分读取301.7 写入文件311.7.1 write源码跟踪311.7.2 追加写的实现331.8 文件的原子读写331.9 文件描述符的复制341.10 文件数据的同步381.11 文件的元数据411.11.1 获取文件的元数据411.11.2 内核如何维护文件的元数据421.11.3 权限位解析431.12 文件截断451.12.1 truncate与ftruncate的简单介绍451.12.2 文件截断的内核实现451.12.3 为什么需要文件截断48第2章 标准I/O库502.1 stdin、stdout和stderr502.2 I/O缓存引出的趣题512.3 fopen和open标志位对比522.4 fdopen与fileno552.5 同时读写的痛苦562.6 ferror的返回值572.7 clearerr的用途572.8 小心fgetc和getc602.9 注意fread和fwrite的返回值602.10 创建临时文件61第3章 进程环境663.1 main是C程序的开始吗663.2 “活雷锋”exit703.3 atexit介绍753.3.1 使用atexit753.3.2 atexit的局限性763.3.3 atexit的实现机制773.4 小心使用环境变量783.5 使用动态库803.5.1 动态库与静态库803.5.2 编译生成和使用动态库803.5.3 程序的“平滑无缝”升级823.6 避免内存问题843.6.1 尴尬的realloc843.6.2 如何防止内存越界853.6.3 如何定位内存问题863.7 “长跳转”longjmp903.7.1 setjmp与longjmp的使用903.7.2 “长跳转”的实现机制913.7.3 “长跳转”的陷阱93第4章 进程控制:进程的一生964.1 进程ID964.2 进程的层次984.2.1 进程组994.2.2 会话1024.3 进程的创建之fork()1034.3.1 fork之后父子进程的内存关系1044.3.2 fork之后父子进程与文件的关系1074.3.3 文件描述符复制的内核实现1104.4 进程的创建之vfork()1154.5 daemon进程的创建1174.6 进程的终止1194.6.1 _exit函数1194.6.2 exit函数1204.6.3 return退出1224.7 等待子进程1224.7.1 僵尸进程1224.7.2 等待子进程之wait()1244.7.3 等待子进程之waitpid()1264.7.4 等待子进程之等待状态值1294.7.5 等待子进程之waitid()1314.7.6 进程退出和等待的内核实现1334.8 exec家族1414.8.1 execve函数1414.8.2 exec家族1424.8.3 execve系统调用的内核实现1444.8.4 exec与信号1514.8.5 执行exec之后进程继承的属性1524.9 system函数1524.9.1 system函数接口1534.9.2 system函数与信号1564.10 总结157第5章 进程控制:状态、调度和优先级1585.1 进程的状态1585.1.1 进程状态概述1595.1.2 观察进程状态1715.2 进程调度概述1735.3 普通进程的优先级1815.4 完全公平调度的实现1865.4.1 时间片和虚拟运行时间1865.4.2 周期性调度任务1905.4.3 新进程的加入1925.4.4 睡眠进程醒来1985.4.5 唤醒抢占2025.5 普通进程的组调度2045.6 实时进程2075.6.1 实时调度策略和优先级2075.6.2 实时调度相关API2115.6.3 限制实时进程运行时间2135.7 CPU的亲和力214第6章 信号2196.1 信号的完整生命周期2196.2 信号的产生2206.2.1 硬件异常2206.2.2 终端相关的信号2216.2.3 软件事件相关的信号2236.3 信号的默认处理函数2246.4 信号的分类2276.5 传统信号的特点2286.5.1 信号的ONESHOT特性2306.5.2 信号执行时屏蔽自身的特性2326.5.3 信号中断系统调用的重启特性2336.6 信号的可靠性2366.6.1 信号的可靠性实验2366.6.2 信号可靠性差异的根源2406.7 信号的安装2436.8 信号的发送2466.8.1 kill、tkill和tgkill2466.8.2 raise函数2476.8.3 sigqueue函数2476.9 信号与线程的关系2536.9.1 线程之间共享信号处理函数2546.9.2 线程有独立的阻塞信号掩码2556.9.3 私有挂起信号和共享挂起信号2576.9.4 致命信号下,进程组全体退出2606.10 等待信号2606.10.1 pause函数2616.10.2 sigsuspend函数2626.10.3 sigwait函数和sigwaitinfo函数2636.11 通过文件描述符来获取信号2656.12 信号递送的顺序2676.13 异步信号安全2726.14 总结275第7章 理解Linux线程(1)2767.1 线程与进程2767.2 进程ID和线程ID2817.3 pthread库接口介绍2847.4 线程的创建和标识2857.4.1 pthread_create函数2857.4.2 线程ID及进程地址空间布局2867.4.3 线程创建的默认属性2917.5 线程的退出2927.6 线程的连接与分离2937.6.1 线程的连接2937.6.2 为什么要连接退出的线程2957.6.3 线程的分离2997.7 互斥量3007.7.1 为什么需要互斥量3007.7.2 互斥量的接口3047.7.3 临界区的大小3057.7.4 互斥量的性能3067.7.5 互斥锁的公平性3107.7.6 互斥锁的类型3117.7.7 死锁和活锁3147.8 读写锁3167.8.1 读写锁的接口3177.8.2 读写锁的竞争策略3187.8.3 读写锁总结3237.9 性能杀手:伪共享3237.10 条件等待3287.10.1 条件变量的创建和销毁3287.10.2 条件变量的使用329第8章 理解Linux线程(2)3338.1 线程取消3338.1.1 函数取消接口3338.1.2 线程清理函数3358.2 线程局部存储3398.2.1 使用NPTL库函数实现线程局部存储3408.2.2 使用__thread关键字实现线程局部存储3428.3 线程与信号3438.3.1 设置线程的信号掩码3448.3.2 向线程发送信号3448.3.3 多线程程序对信号的处理3458.4 多线程与fork()345第9章 进程间通信:管道3499.1 管道3519.1.1 管道概述3519.1.2 管道接口3529.1.3 关闭未使用的管道文件描述符3569.1.4 管道对应的内存区大小3619.1.5 shell管道的实现3619.1.6 与shell命令进行通信(popen)3629.2 命名管道FIFO3659.2.1 创建FIFO文件3659.2.2 打开FIFO文件3669.3 读写管道文件3679.4 使用管道通信的示例372第10章 进程间通信:System V IPC37510.1 System V IPC概述37510.1.1 标识符与IPC Key37610.1.2 IPC的公共数据结构37910.2 System V消息队列38310.2.1 创建或打开一个消息队列38310.2.2 发送消息38510.2.3 接收消息38810.2.4 控制消息队列39010.3 System V信号量39110.3.1 信号量概述39110.3.2 创建或打开信号量39310.3.3 操作信号量39510.3.4 信号量撤销值39910.3.5 控制信号量40010.4 System V共享内存40210.4.1 共享内存概述40210.4.2 创建或打开共享内存40310.4.3 使用共享内存40510.4.4 分离共享内存40710.4.5 控制共享内存408第11章 进程间通信:POSIX IPC41011.1 POSIX IPC概述41111.1.1 IPC对象的名字41111.1.2 创建或打开IPC对象41311.1.3 关闭和删除IPC对象41411.1.4 其他41411.2 POSIX消息队列41511.2.1 消息队列的创建、打开、关闭及删除41511.2.2 消息队列的属性41811.2.3 消息的发送和接收42211.2.4 消息的通知42311.2.5 I/O多路复用监控消息队列42711.3 POSIX信号量42811.3.1 创建、打开、关闭和删除有名信号量43011.3.2 信号量的使用43111.3.3 无名信号量的创建和销毁43211.3.4 信号量与futex43311.4 内存映射mmap43611.4.1 内存映射概述43611.4.2 内存映射的相关接口43811.4.3 共享文件映射43911.4.4 私有文件映射45511.4.5 共享匿名映射45511.4.6 私有匿名映射45611.5 POSIX共享内存45611.5.1 共享内存的创建、使用和删除45711.5.2 共享内存与tmpfs458第12章 网络通信:连接的建立46212.1 socket文件描述符46212.2 绑定IP地址46312.2.1 bind的使用46412.2.2 bind的源码分析46512.3 客户端连接过程46812.3.1 connect的使用46812.3.2 connect的源码分析46912.4 服务器端连接过程47712.4.1 listen的使用47712.4.2 listen的源码分析47812.4.3 accept的使用48012.4.4 accept的源码分析48012.5 TCP三次握手的实现分析48312.5.1 SYN包的发送48312.5.2 接收SYN包,发送SYN+ACK包48512.5.3 接收SYN+ACK数据包49412.5.4 接收ACK数据包,完成三次握手499第13章 网络通信:数据报文的发送50513.1 发送相关接口50513.2 数据包从用户空间到内核空间的流程50613.3 UDP数据包的发送流程51013.4 TCP数据包的发送流程51713.5 IP数据包的发送流程52713.5.1 ip_send_skb源码分析52813.5.2 ip_queue_xmit源码分析53113.6 底层模块数据包的发送流程532第14章 网络通信:数据报文的接收53614.1 系统调用接口53614.2 数据包从内核空间到用户空间的流程53714.3 UDP数据包的接收流程54014.4 TCP数据包的接收流程54414.5 TCP套接字的三个接收队列55314.6 从网卡到套接字55614.6.1 从硬中断到软中断55614.6.2 软中断处理55714.6.3 传递给协议栈流程55914.6.4 IP协议处理流程56414.6.5 大师的错误?原始套接字的接收56814.6.6 注册传输层协议57114.6.7 确定UDP套接字57114.6.8 确定TCP套接字576第15章 编写安全无错代码58215.1 不要用memcmp比较结构体58215.2 有符号数和无符号数的移位区别58315.3 数组和指针58415.4 再论数组首地址58715.5 “神奇”的整数类型转换58815.6 小心volatile的原子性误解58915.7 有趣的问题:“x == x”何时为假?59115.8 小心浮点陷阱59315.8.1 浮点数的精度限制59315.8.2 两个特殊的浮点值59315.9 Intel移位指令陷阱595
下载地址