万本电子书0元读

万本电子书0元读

顶部广告

Linux环境编程:从应用到内核电子书

  Linux领域*一本将应用编程与内核实现相结合的图书   Linux环境编程的阶指导,帮助应用发人员快速深内核,解析Linux口的工作原理,清楚掌握Linux系统运行机制

售       价:¥

纸质售价:¥68.30购买纸书

42人正在读 | 0人评论 6.6

作       者:高峰,李彬

出  版  社:机械工业出版社

出版时间:2016-05-01

字       数:61.9万

所属分类: 科技 > 计算机/网络 > 程序设计

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
《UNIX环境高级编程》(简称APUE)几乎是Linux领域程序员人手的一本书。但在掌握和理解APUE的内容后,又该如何继续提高自己的技能, 如何更深地理解Linux环境编程及其背后的工作机制呢?本书将从一个全新的角度带领读者重新Linux环境编程,从应用出发,深内核源码,研究 Linux各口的工作机制和原理,让读者不仅知其然,还知其所以然。作为Linux发工程师,如果不仅掌握Linux的应用层发,同时还熟悉 Linux的内核源码,那么其在Linux环境下设计发任何产品都将游刃有余,稳定且高效。 本书是Linux技术专家高峰和李彬的合力之 作,是两个人多年发经验的总结和分享,也是市场上一本将Linux应用态与内核态相结合的技术图书,选择这种写作方式是为了向APUE的作者致敬。 本书涵盖了APUE中大部分章节的内容,并针对Linux环境,以作者多年经验,详细解析了Linux常用口的使用方法和陷阱。为了让读者更清楚地理解 口的工作原理,对于绝大部分口,作者都会深C库或内核源码行全面分析。希望本书可以帮助读者通Linux环境的应用和内核两条脉络,使两条线融 会贯通,一步提高发水平。<br/>【推荐语】<br/>  Linux领域*一本将应用编程与内核实现相结合的图书 Linux环境编程的阶指导,帮助应用发人员快速深内核,解析Linux口的工作原理,清楚掌握Linux系统运行机制<br/>【作者】<br/>高峰,北京理工大学通信与信息系统专业硕士学位。毕业后在A10 Networks公司工作六年多,任职Staff Software Engineer,目前在创业公司全讯汇聚(爱快路由)担任技术总监。多年来一直专注于网络领域,熟悉Linux内核、应用及服务端的设计、发和架构, 对TCP/IP网络协议有深刻的认识和理解。编码功力深厚,知识领域广博,擅长产品的性能改和调优。撰写过大量技术文章,并为多个知名源项目贡献过代 码。 李彬,东南大学信号与信息处理专业硕士。毕业后先后任职中兴通讯、趋势科技,目前在存储公司Bigtera担任SEG部门技术负 责人。一直专注于Linux平台下的发,多年分布式存储发经验,熟悉Linux内核,编程基本功扎实,对性能优化、bug定位有异乎寻常的爱好,属于 “死磕派”研发工程师。喜欢技术分享和交流,在社区和公司内部分享过大量技术文章。<br/>
目录展开

前言

第0章 基础知识

0.1 一个Linux程序的诞生记

0.2 程序的构成

0.3 程序是如何“跑”的

0.4 背景概念介绍

0.4.1 系统调用

0.4.2 C库函数

0.4.3 线程安全

0.4.4 原子性

0.4.5 可重入函数

0.4.6 阻塞与非阻塞

0.4.7 同步与非同步

第1章 文件I/O

1.1 Linux中的文件

1.1.1 文件、文件描述符和文件表

1.1.2 内核文件表的实现

1.2 打开文件

1.2.1 open介绍

1.2.2 更多选项

1.2.3 open源码跟踪

1.2.4 如何选择文件描述符

1.2.5 文件描述符fd与文件管理结构file

1.3 creat简介

1.4 关闭文件

1.4.1 close介绍

1.4.2 close源码跟踪

1.4.3 自定义files_operations

1.4.4 遗忘close造成的问题

1.4.5 如何查找文件资源泄漏

1.5 文件偏移

1.5.1 lseek简介

1.5.2 小心lseek的返回值

1.5.3 lseek源码分析

1.6 读取文件

1.6.1 read源码跟踪

1.6.2 部分读取

1.7 写入文件

1.7.1 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与ftruncate的简单介绍

1.12.2 文件截断的内核实现

1.12.3 为什么需要文件截断

第2章 标准I/O库

2.1 stdin、stdout和stderr

2.2 I/O缓存引出的趣题

2.3 fopen和open标志位对比

2.4 fdopen与fileno

2.5 同时读写的痛苦

2.6 ferror的返回值

2.7 clearerr的用途

2.8 小心fgetc和getc

2.9 注意fread和fwrite的返回值

2.10 创建临时文件

第3章 进程环境

3.1 main是C程序的开始吗

3.2 “活雷锋”exit

3.3 atexit介绍

3.3.1 使用atexit

3.3.2 atexit的局限性

3.3.3 atexit的实现机制

3.4 小心使用环境变量

3.5 使用动态库

3.5.1 动态库与静态库

3.5.2 编译生成和使用动态库

3.5.3 程序的“平滑无缝”升级

3.6 避免内存问题

3.6.1 尴尬的realloc

3.6.2 如何防止内存越界

3.6.3 如何定位内存问题

3.7 “长跳转”longjmp

3.7.1 setjmp与longjmp的使用

3.7.2 “长跳转”的实现机制

3.7.3 “长跳转”的陷阱

第4章 进程控制:进程的一生

4.1 进程ID

4.2 进程的层次

4.2.1 进程组

4.2.2 会话

4.3 进程的创建之fork()

4.3.1 fork之后父子进程的内存关系

4.3.2 fork之后父子进程与文件的关系

4.3.3 文件描述符复制的内核实现

4.4 进程的创建之vfork()

4.5 daemon进程的创建

4.6 进程的终止

4.6.1 _exit函数

4.6.2 exit函数

4.6.3 return退出

4.7 等待子进程

4.7.1 僵尸进程

4.7.2 等待子进程之wait()

4.7.3 等待子进程之waitpid()

4.7.4 等待子进程之等待状态值

4.7.5 等待子进程之waitid()

4.7.6 进程退出和等待的内核实现

4.8 exec家族

4.8.1 execve函数

4.8.2 exec家族

4.8.3 execve系统调用的内核实现

4.8.4 exec与信号

4.8.5 执行exec之后进程继承的属性

4.9 system函数

4.9.1 system函数接口

4.9.2 system函数与信号

4.10 总结

第5章 进程控制:状态、调度和优先级

5.1 进程的状态

5.1.1 进程状态概述

5.1.2 观察进程状态

5.2 进程调度概述

5.3 普通进程的优先级

5.4 完全公平调度的实现

5.4.1 时间片和虚拟运行时间

5.4.2 周期性调度任务

5.4.3 新进程的加入

5.4.4 睡眠进程醒来

5.4.5 唤醒抢占

5.5 普通进程的组调度

5.6 实时进程

5.6.1 实时调度策略和优先级

5.6.2 实时调度相关API

5.6.3 限制实时进程运行时间

5.7 CPU的亲和力

第6章 信号

6.1 信号的完整生命周期

6.2 信号的产生

6.2.1 硬件异常

6.2.2 终端相关的信号

6.2.3 软件事件相关的信号

6.3 信号的默认处理函数

6.4 信号的分类

6.5 传统信号的特点

6.5.1 信号的ONESHOT特性

6.5.2 信号执行时屏蔽自身的特性

6.5.3 信号中断系统调用的重启特性

6.6 信号的可靠性

6.6.1 信号的可靠性实验

6.6.2 信号可靠性差异的根源

6.7 信号的安装

6.8 信号的发送

6.8.1 kill、tkill和tgkill

6.8.2 raise函数

6.8.3 sigqueue函数

6.9 信号与线程的关系

6.9.1 线程之间共享信号处理函数

6.9.2 线程有独立的阻塞信号掩码

6.9.3 私有挂起信号和共享挂起信号

6.9.4 致命信号下,进程组全体退出

6.10 等待信号

6.10.1 pause函数

6.10.2 sigsuspend函数

6.10.3 sigwait函数和sigwaitinfo函数

6.11 通过文件描述符来获取信号

6.12 信号递送的顺序

6.13 异步信号安全

6.14 总结

第7章 理解Linux线程(1)

7.1 线程与进程

7.2 进程ID和线程ID

7.3 pthread库接口介绍

7.4 线程的创建和标识

7.4.1 pthread_create函数

7.4.2 线程ID及进程地址空间布局

7.4.3 线程创建的默认属性

7.5 线程的退出

7.6 线程的连接与分离

7.6.1 线程的连接

7.6.2 为什么要连接退出的线程

7.6.3 线程的分离

7.7 互斥量

7.7.1 为什么需要互斥量

7.7.2 互斥量的接口

7.7.3 临界区的大小

7.7.4 互斥量的性能

7.7.5 互斥锁的公平性

7.7.6 互斥锁的类型

7.7.7 死锁和活锁

7.8 读写锁

7.8.1 读写锁的接口

7.8.2 读写锁的竞争策略

7.8.3 读写锁总结

7.9 性能杀手:伪共享

7.10 条件等待

7.10.1 条件变量的创建和销毁

7.10.2 条件变量的使用

第8章 理解Linux线程(2)

8.1 线程取消

8.1.1 函数取消接口

8.1.2 线程清理函数

8.2 线程局部存储

8.2.1 使用NPTL库函数实现线程局部存储

8.2.2 使用__thread关键字实现线程局部存储

8.3 线程与信号

8.3.1 设置线程的信号掩码

8.3.2 向线程发送信号

8.3.3 多线程程序对信号的处理

8.4 多线程与fork()

第9章 进程间通信:管道

9.1 管道

9.1.1 管道概述

9.1.2 管道接口

9.1.3 关闭未使用的管道文件描述符

9.1.4 管道对应的内存区大小

9.1.5 shell管道的实现

9.1.6 与shell命令进行通信(popen)

9.2 命名管道FIFO

9.2.1 创建FIFO文件

9.2.2 打开FIFO文件

9.3 读写管道文件

9.4 使用管道通信的示例

第10章 进程间通信:System V IPC

10.1 System V IPC概述

10.1.1 标识符与IPC Key

10.1.2 IPC的公共数据结构

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.3.4 信号量撤销值

10.3.5 控制信号量

10.4 System V共享内存

10.4.1 共享内存概述

10.4.2 创建或打开共享内存

10.4.3 使用共享内存

10.4.4 分离共享内存

10.4.5 控制共享内存

第11章 进程间通信:POSIX IPC

11.1 POSIX IPC概述

11.1.1 IPC对象的名字

11.1.2 创建或打开IPC对象

11.1.3 关闭和删除IPC对象

11.1.4 其他

11.2 POSIX消息队列

11.2.1 消息队列的创建、打开、关闭及删除

11.2.2 消息队列的属性

11.2.3 消息的发送和接收

11.2.4 消息的通知

11.2.5 I/O多路复用监控消息队列

11.3 POSIX信号量

11.3.1 创建、打开、关闭和删除有名信号量

11.3.2 信号量的使用

11.3.3 无名信号量的创建和销毁

11.3.4 信号量与futex

11.4 内存映射mmap

11.4.1 内存映射概述

11.4.2 内存映射的相关接口

11.4.3 共享文件映射

11.4.4 私有文件映射

11.4.5 共享匿名映射

11.4.6 私有匿名映射

11.5 POSIX共享内存

11.5.1 共享内存的创建、使用和删除

11.5.2 共享内存与tmpfs

第12章 网络通信:连接的建立

12.1 socket文件描述符

12.2 绑定IP地址

12.2.1 bind的使用

12.2.2 bind的源码分析

12.3 客户端连接过程

12.3.1 connect的使用

12.3.2 connect的源码分析

12.4 服务器端连接过程

12.4.1 listen的使用

12.4.2 listen的源码分析

12.4.3 accept的使用

12.4.4 accept的源码分析

12.5 TCP三次握手的实现分析

12.5.1 SYN包的发送

12.5.2 接收SYN包,发送SYN+ACK包

12.5.3 接收SYN+ACK数据包

12.5.4 接收ACK数据包,完成三次握手

第13章 网络通信:数据报文的发送

13.1 发送相关接口

13.2 数据包从用户空间到内核空间的流程

13.3 UDP数据包的发送流程

13.4 TCP数据包的发送流程

13.5 IP数据包的发送流程

13.5.1 ip_send_skb源码分析

13.5.2 ip_queue_xmit源码分析

13.6 底层模块数据包的发送流程

第14章 网络通信:数据报文的接收

14.1 系统调用接口

14.2 数据包从内核空间到用户空间的流程

14.3 UDP数据包的接收流程

14.4 TCP数据包的接收流程

14.5 TCP套接字的三个接收队列

14.6 从网卡到套接字

14.6.1 从硬中断到软中断

14.6.2 软中断处理

14.6.3 传递给协议栈流程

14.6.4 IP协议处理流程

14.6.5 大师的错误?原始套接字的接收

14.6.6 注册传输层协议

14.6.7 确定UDP套接字

14.6.8 确定TCP套接字

第15章 编写安全无错代码

15.1 不要用memcmp比较结构体

15.2 有符号数和无符号数的移位区别

15.3 数组和指针

15.4 再论数组首地址

15.5 “神奇”的整数类型转换

15.6 小心volatile的原子性误解

15.7 有趣的问题:“x==x”何时为假?

15.8 小心浮点陷阱

15.8.1 浮点数的精度限制

15.8.2 两个特殊的浮点值

15.9 Intel移位指令陷阱

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部