《UNIX环境高级编程》(简称APUE)几乎是Linux领域程序员人手必备的一本书。但在掌握和理解APUE的内容后,又该如何继续提高自己的技能,如何更深入地理解Linux环境编程及其背后的工作机制呢?本书将从一个全新的角度带领读者重新进入Linux环境编程,从应用出发,深入内核源码,研究Linux各接口的工作机制和原理,让读者不仅知其然,还知其所以然。作为Linux开发工程师,如果不仅掌握Linux的应用层开发,同时还熟悉Linux的内核源码,那么其在Linux环境下设计开发任何产品都将游刃有余,稳定且高效。, 本书是Linux技术专家高峰和李彬的合力之作,是两个人多年开发经验的总结和分享,也目录前言第0章基础知识0.1个Linu程序的诞生记02程序的构成0.3程序是如何“跑”的04背景概念介绍0.4.1系统调用0.4.2C库函数0.4.3线程安全044原子性04.5可重入函数0.4.6阻塞与非阻塞04.7同步与非同步第1章文件O1.1 Linux中的文件1.1.1文件、文件描述符和文件表1.1.2内核文件表的实现1.2打开文件1.2.1open介绍1.2.2更多选项1.2.3 open源码跟踪1.2.4如何选择文件描述符1.2.5文件描述符与文件管理结构fle1.3 creat简介1.4关闭文件1.4.1cosc介绍1.4.2 close源码跟踪14.3自定义 files operations1.4.4遗忘 close造成的问题1.4.5如何查找文件资源泄漏1.5文件偏移1.5.1 Iseek简介1.5.2小心 Iseek的返回值1.5.31seek源码分析6读取文件1.6. I read源码跟踪1.6.2部分读取1.7写入文件1.7. I write源码跟踪1.7.2追加写的实现1.8文件的原子读写1.9文件描述符的复制1.10文件数据的同步1.11文件的元数据1.11.1获取文件的元数据1.11.2内核如何维扩文件的元数据1.11.3权限位解析1.12文件截断1.12.1 truncate与 truncate的简单介绍1.12.2文件截断的内核实现1.123为什么需要文件截断第2章标准ⅣO库2.1 stdin、 stdout和 stderr2.2IO缓存引出的趣题2.3 fopen和open标志位对比24 fopen与 fileno2.5同时读写的痛苦2.6 ferror的返回值2.7 clearer的用途2.8小心getc和getc2.9注意fead和 writer的返回值2.10创建临时文件第3章进程环境3.1main是C程序的开始吗3.2“活雷锋”exit3.3 atexit介绍3.3.1使用 atexit3.3.2 atexit的局限性33.3 atexit的实现机制34小心使用环境变量3.5使用动态库3.5.1动态库与静态库3.52编译生成和使用动态库3.53程序的“平滑无缝”升级3.6避免内存问题3.6.1尴尬的 realloc3.6.2如何防止内存越界3.6.3如何定位内存问题3.7“长跳转 longjmp3.71 stump与 ilongimp的使用3.7.2“长跳转”的实现机制3.7.3“长跳转”的陷阱第4章进程控制:进程的一生4.1进程ID4.2进程的层次4.2.1进程组4.2.2会话43进程的创建之fok()4.3.1fok之后父子进程的内存关系4.3.2frk之后父子进程与文件的关系43.3文件描述符复制的内核实现4.4进程的创建之 vfork()4.5 daemon进程的创建4.6进程的终止4.6.1cxi函数4.6.2exi函数4.6.3 return退出4.7等待子进程4.7.1僵尸进程4.7.2等待子进程之wait()47.3等待子进程之 waitpid()4.7.4等待子进程之等待状态值4.7.5等待子进程之 waited()4.7.6进程退出和等待的内核实现4.8exec家族4.8.1 execve函数4.8.2exec家族4.8.3 execve系统调用的内核实现4.8.4exec与信号4.8.5执行exec之后进程继承的属性4.9 system函数4.9.1 syste函数接口4.9.2 system函数与信号4.10总结第5章进程控制:状态、调度和优先级5.1进程的状态5.1.1进程状态概述5.1.2观察进程状态5.2进程调度概述53普通进程的优先级54完全公平调度的实现54.1时间片和虚拟运行时间54.2周期性调度任务5.4.3新进程的加入5.44睡眠进程醒来54.5唤醒抢占5.5普通进程的组调度5.6实时进程5.6.1实时调度策略和优先级5.6.2实时调度相关API5.6.3限制实时进程运行时间5.7CPU的亲和力第6章信号6.1信号的完整生命周期62信号的产生6.2.1硬件异常6.2.2终端相关的信号62.3软件事件相关的信号6.3信号的默认处理函数64信号的分类65传统信号的特点6.5.1信号的 ONESHOT特性6.52信号执行时屏敝自身的特性65.3信号中断系统调用的重启特性6.6信号的可靠性6.6.1信号的可靠性实验6.6.2信号可靠性差异的根源6.7信号的安装6.8信号的发送6.8.1 kill kill和 tokill6.8.2 raIsc函数68.3 sigqueue函数69信号与线程的关系69.1线程之间共享信号处理函数69.2线程有独立的阻塞信号掩码69.3私有挂起信号和共亨挂起信号69.4致命信号下,进程组全体退出6.10等待信号6.10.1 pause函数6.10.2 sigsuspend函数6.10.3 Sigwalt函数和 sigwaitinfo函数6.11通过文件描述符来获取信号6.12信号递送的顺序6.13异步信号安全6.14总结第7章理解Linⅸ线程(1)7.1线程与进程7.2进程ID和线程ID7.3 pthread库接口介绍74线程的创建和标识7.41 pthread create函数7.4.2线程I及进程地址空间布局7.4.3线程创建的默认属性7.5线程的退出7.6线程的连接与分离7.6.1线程的连接7.6,2为什么要连接退出的线程7.63线程的分离7.7互斥量7.7.1为什么需要互斥量7.7.2互斥量的接口7.7.3临界区的大小7.74互斥量的性能7.7.5互斥锁的公平性7.7.6互斥锁的类型7.7.7死锁和活懺7.8读写锁7.8.1读写锁的接凵7.8.2读写锁的竞争策略7.8.3读写锁总结79性能杀于:伪共享7.10条件等待7.10.1条件变量的创建和销毁7.10.2条件变量的使用第8章理解 Linux线程(2)8.1线程取消8.1.1函数取消接口8.1.2线程清理函数8.2线程局部存储82.1使用NPTL库函数实现线程局部存储8.2.2使用 thread关键字实现线程局部存储8.3线程与信号83.1设置线程的信号掩码83.2向线程发送信号83.3多线程程序对信号的处理84多线程与fork()第9章进程间通信:管道9.1管道9.1.1管道概述9.1.2管道接口9.1.3关闭未使用的管道文件描述符9.14管道对应的内存区大小9.1.5she管道的实现9.1.6与she'令进行通信( popen)92命名管道FIFO92.1创建FIFO文件922打开FIFO文件93读写管道文件94使用管道通信的示例第10章进程间通信: System V IPC10.1 System V IPC概述10.1.1标识符与 IPC Key10.1.2C的公共数据结构10.2 System V消息队列10.2.1创建或打开一个消息队列10.2.2发送消息10.2.3接收消息10.2.4控制消息队列10.3 System V信号量10.3.1信号量概述10.3.2创建或打开信号量10.3.3操作信号量10.34信号量撤销值10.3.5控制信号量10.4 System V共享内存10.4.1共享内存概述10.42创建或打开共享内存10.4.3使用共享内存10.44分离共享内存10.4.5控制共享内存第11章进程间通信: POSIX IPO1.1 POSIX PC概述11.1.1PC对象的名字11.1.2创建或打开IPC对象11.1.3关闭和删除IPC对象11.1.4其他11.2POSⅨX消息队列11.2.1消息队列的创建、打开、关闭及删除11.2.2消息队列的属性11.2.3消息的发送和接收11.2.4消息的通知11.2.5O多路复用监控消息队列11.3 POSIX信号量11.3.1创建、打开、关闭和删除有名信号量