自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(0)
  • 资源 (33)
  • 问答 (2)
  • 收藏
  • 关注

空空如也

花1万元PCB设计高级讲座 -- PCB设计讲义.zip

手机板在目前的设计中结合了射频RF设计、模拟数字电路、高速高密度布线、BGA器件、盲埋孔设计、多层板叠 层等诸多挑战,这个PCB高级设计讲义以一个手机板为案例,讲解了现在高速高密PCB Layout的各个知识点,当然也是作为一个高速PCB设计工程师所必知必会的内容。 当然了,单靠一份PDF稳定,或者一两个小时的网络课程,就能让你深入了解高速高密PCB Layout的各个知识点,那是不现实的。老wu觉得,这份PCB高级设计讲义至少可以作为一个进入高速高密PCB Layout的敲门砖,我们可以根据这些知识点在深入展开学习。

2020-07-16

EDA IC 设计手册.zip

由可配置处理器供应商Tensilica的首席科学家Grant Martin、Cadence公司Louis Scheffer和Cadence柏克莱实验室的Luciano Lavagno合作编写的新书《Electronic Design Automation Circuits Handbook》,是一本2册的参考书,内容涵盖了用于IC设计的设计自动化演算法、工具和方法学。这套书籍分为2册,由Taylor & Francis出版,并已开始销售。 第一册:《EDA for IC System Design, Verification, and Testing》,是有关IC设计和EDA的概述,解释了系统级设计、微架构设计、验证工具以及测试方法。第二册:《EDA for IC Implementation, Circuit Design, and Process Technology》,详细介绍了传统RTL到GDSII的设计流程,包括合成、布局和布线制程。 Tensilica技术讲师Steve Leibson撰写了章节《Using Performance Metrics to Select Microprocessor Cores for IC Designs》。该章节讨论了为SoC设计选择处理器核心时必须考虑的许多性能要素,以及可用来比较处理器核心性能的基准测试程式。该章节还包括了从当代电子电脑被发明以来,电脑基准测试程式的全部历史资料。 Tensilica的产品市场经理和加州大学圣地牙哥分校的Rajesh Gupta以及维吉尼亚工学院Sandeep Shukla,则合写了章节《Parallelizing High-Level Synthesis: A Code Transformational Approach to High-Level Synthesis》。该章集中描述了可产生高效电路的协同编译器和高级合成转换的最近进展,同时介绍了在设计过程中提升抽象层级的系统级建模技术和语言的最新发展。

2020-07-16

GitHub入门与实践

《GitHub入门与实践》,人民邮电出版社出版,外文书名: GitHub実践入門,作者:大塚弘记 (作者), 支鹏浩 (译者), 刘斌 (译者)。《GitHub入门与实践》从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作,使用GitHub的开发流程以及如何将GitHub引入到企业中。在讲解GitHub的代表功能Pull Request时,本书专门搭建了供各位读者实践的仓库,邀请各位读者进行Pull Request并共同维护。 《GitHub入门与实践》旨在指导各位读者如何在开发现场使用GitHub进行高效开发,适合所有想要使用GitHub进行开发的程序员或团队阅读。

2019-02-27

深度学习:智能时代的核心驱动力量 电子书

《深度学习:智能时代的核心驱动力量》,中信出版社出版,作者:特伦斯·谢诺夫斯基 (Terrence Sejnowski) (作者), 姜悦兵 (译者)。全球科技巨头纷纷拥抱深度学习,自动驾驶、AI医疗、语音识别、图像识别、智能翻译以及震惊世界的AlphaGo,背后都是深度学习在发挥神奇的作用。深度学习是人工智能从概念到繁荣得以实现的主流技术。经过深度学习训练的计算机,不再被动按照指令运转,而是像自然进化的生命那样,开始自主地从经验中学习。 本书作者特伦斯·谢诺夫斯基是全球人工智能十大科学家之一、深度学习先驱及奠基者,亲历了深度学习在20世纪70年代到90年代的寒冬。但他和一众开拓者,利用大数据和不断增强的计算能力,终于在神经网络算法上取得重大突破,实现了人工智能井喷式的发展。 作为深度学习领域的通识作品,本书以恢弘的笔触,通过3个部分全景展现了深度学习的发展、演变与应用,首次以亲历者视角回溯了深度学习浪潮在过去60年间的发展脉络与人工智能的螺旋上升,并前瞻性地预测了智能时代的商业图景。

2019-02-27

3D with rotation on matlab 三维装箱问题代码

3D with rotation on matlab 三维装箱问题代码 实测可以运行 MATLAB代码 欢迎下载

2019-02-27

3维装箱问题 C语言实例

3维装箱问题 C语言实例 可以运行 欢迎您下载使用 如果有问题可以私聊我

2019-02-27

三维装箱和VRP结合的MATLAB算法

三维装箱和VRP结合的MATLAB算法,挺好的,需要输入数据后使用

2019-01-25

深入理解C指针(NEW VERSION)

《深入理解C指针》,人民邮电出版社出版,外文书名:Understanding and Using C Pointers。作者:Richard Reese (作者),‎ 陈晓亮 (译者)。指针是C语言的一项核心特性,对于指针的掌握程度是区分C语言新手与老手的重要标志。《深入理解C指针》专门研究指针,旨在提供比其他图书更全面和深入的C 指针和内存管理知识。全书巨细靡遗地为读者展现了C语言编程中最重要的话题:C的动态内存管理、指针和函数、指针和数组、指针和字符串、指针和结构体。作者还专门用一章篇幅讲解了安全问题和指针误用,让读者对指针的认识又深入一层。全书每章都穿插了使用指针的注意事项和潜在陷阱,及时贴心地提示读者在编程中避开此类问题。 《深入理解C指针》适合C和C++程序员和开发人员阅读,也可作为计算机专业学生学习C语言的参考图书。 《深入理解C指针》图书目录 第1章 认识指针 1.1 指针和内存 1.1.1 为什么要精通指针 1.1.2 声明指针 1.1.3 如何阅读声明 1.1.4 地址操作符 1.1.5 打印指针的值 1.1.6 用间接引用操作符解引指针 1.1.7 指向函数的指针 1.1.8 null的概念 1.2 指针的长度和类型 1.2.1 内存模型 1.2.2 指针相关的预定义类型 1.3 指针操作符 1.3.1 指针算术运算 1.3.2 比较指针 1.4 指针的常见用法 1.4.1 多层间接引用 1.4.2 常量与指针 1.5 小结 第2章 C的动态内存管理 2.1 动态内存分配 2.2 动态内存分配函数 2.2.1 使用malloc函数 2.2.2 使用calloc函数 2.2.3 使用realloc函数 2.2.4 alloca函数和变长数组 2.3 用free函数释放内存 2.3.1 将已释放的指针赋值为NULL 2.3.2 重复释放 2.3.3 堆和系统内存 2.3.4 程序结束前释放内存 2.4 迷途指针 2.4.1 迷途指针示例 2.4.2 处理迷途指针 2.4.3 调试器对检测内存泄漏的支持 2.5 动态内存分配技术 2.5.1 C的垃圾回收 2.5.2 资源获取即初始化 2.5.3 使用异常处理函数 2.6 小结 第3章 指针和函数 3.1 程序的栈和堆 3.1.1 程序栈 3.1.2 栈帧的组织 3.2 通过指针传递和返回数据 3.2.1 用指针传递数据 3.2.2 用值传递数据 3.2.3 传递指向常量的指针 3.2.4 返回指针 3.2.5 局部数据指针 3.2.6 传递空指针 3.2.7 传递指针的指针 3.3 函数指针 3.3.1 声明函数指针 3.3.2 使用函数指针 3.3.3 传递函数指针 3.3.4 返回函数指针 3.3.5 使用函数指针数组 3.3.6 比较函数指针 3.3.7 转换函数指针 3.4 小结 第4章 指针和数组 4.1 数组概述 4.1.1 一维数组 4.1.2 二维数组 4.1.3 多维数组 4.2 指针表示法和数组 4.3 用malloc创建一维数组 4.4 用realloc调整数组长度 4.5 传递一维数组 4.5.1 用数组表示法 4.5.2 用指针表示法 4.6 使用指针的一维数组 4.7 指针和多维数组 4.8 传递多维数组 4.9 动态分配二维数组 4.9.1 分配可能不连续的内存 4.9.2 分配连续内存 4.10 不规则数组和指针 4.11 小结 第5章 指针和字符串 5.1 字符串基础 5.1.1 字符串声明 5.1.2 字符串字面量池 5.1.3 字符串初始化 5.2 标准字符串操作 5.2.1 比较字符串 5.2.2 复制字符串 5.2.3 拼接字符串 5.3 传递字符串 5.3.1 传递简单字符串 5.3.2 传递字符常量的指针 5.3.3 传递需要初始化的字符串 5.3.4 给应用程序传递参数 5.4 返回字符串 5.4.1 返回字面量的地址 5.4.2 返回动态分配内存的地址 5.5 函数指针和字符串 5.6 小结 第6章 指针和结构体 6.1 介绍 6.2 结构体释放问题 6.3 避免malloc/free开销 6.4 用指针支持数据结构 6.4.1 单链表 6.4.2 用指针支持队列 6.4.3 用指针支持栈 6.4.4 用指针支持树 6.5 小结 第7章 安全问题和指针误用 7.1 指针的声明和初始化 7.1.1 不恰当的指针声明 7.1.2 使用指针前未初始化 7.1.3 处理未初始化指针 7.2 指针的使用问题 7.2.1 测试NULL 7.2.2 错误使用解引操作 7.2.3 迷途指针 7.2.4 越过数组边界访问内存 7.2.5 错误计算数组长度 7.2.6 错误使用sizeof操作符 7.2.7 一定要匹配指针类型 7.2.8 有界指针 7.2.9 字符串的安全问题 7.2.10 指针算术运算和结构体 7.2.11 函数指针的问题 7.3 内存释放问题 7.3.1 重复释放 7.3.2 清除敏感数据 7.4 使用静态分析工具 7.5 小结 第8章 其他重要内容 8.1 转换指针 8.1.1 访问特殊用途的地址 8.1.2 访问端口 8.1.3 用DMA访问内存 8.1.4 判断机器的字节序 8.2 别名、强别名和restrict关键字 8.2.1 用联合体以多种方式表示值 8.2.2 强别名 8.2.3 使用restrict关键字 8.3 线程和指针 8.3.1 线程间共享指针 8.3.2 用函数指针支持回调 8.4 面向对象技术 8.4.1 创建和使用不透明指针 8.4.2 C中的多态 8.5 小结

2018-02-25

算法精解 - C语言描述(NEW VERSION)

《算法精解:C语言描述》,机械工业出版社出版,外文书名:Mastering Algorithms with C。作者:(美)Kyle Loudon (作者),‎ 肖翔 (译者),‎ 陈舸 (译者) 。《算法精解:C语言描述》是数据结构和算法领域的经典之作,十余年来,畅销不衰!全书共分为三部分:部分首先介绍了数据结构和算法的概念,以及使用它们的原因和意义,然后讲解了数据结构和算法中最常用的技术——指针和递归,最后还介绍了算法的分析方法,旨在为读者学习这本书打下坚实的基础;第二部分对链表、栈、队列、集合、哈希表、堆、图等常用数据结构进行了深入阐述;第三部分对排序、搜索数值计算、数据压缩、数据加密、图算法、几何算法等经典算法进行了精辟的分析和讲解。 本书的众多特色使得它在同类书中独树一帜:具体实现都采用正式的C语言代码而不是伪代码,在很多数据结构和算法的实现过程中,有大量细节问题是伪代码不能解决的;每一章都有精心组织的主题和应用;全部示例来自真实的应用,不只是一般的练习;对每种数据结构、算法和示例都进行了详细分析;每一章的末尾都会有一系列问题和对应的回答,旨在强调这一章的重要思想…… 本书中的代码尤为值得强调:所有实现都采用C语言编写,所有代码都优先用于教学目的,所有代码都在4种平台上经过完整测试,头文件记录了所有公共的接口,命名规则适用于全书所有的代码,所有的代码都包含大量注释…… 《O’Reilly精品图书系列·算法精解:C语言描述》内容包括: · 数据结构和算法的概念,以及使用它们的原因和意义 · 指针和递归 · 算法分析 · 常用数据结构:链表、栈、队列、集合、哈希表、树、堆、优先级队列以及图 · 排序和搜索 · 数值计算 · 数据压缩 · 数据加密 · 图算法 · 几何算法

2018-02-20

Linux_UNIX系统编程手册-下册(NEW)

《Linux/UNIX系统编程手册(套装上下册)》,人民邮电出版社出版,外文书名: The Linux Programming Interface。作者:凯利斯克 (Michael Kerrisk) (作者),‎ 孙剑 (译者),‎ 许从年 (译者),‎ 董健 (译者),‎ 孙余强 (译者),‎ 等。《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权 威著作。Linux编程资 深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。《Linux/UNIX系统编程手册(上、下册)》涵盖了逾500个系统调用及库函数,并给出逾200个程序示例,另含88张表格和115幅示意图。 《Linux/UNIX系统编程手册(上、下册)》总共分为64章,主要讲解了高效读写文件,对信号、时钟和定时器的运用,创建进程、执行程序,编写安全的应用程序,运用POSIX线程技术编写多线程程序,创建和使用共享库,运用管道、消息队列、共享内存和信号量技术来进行进程间通信,以及运用套接字API编写网络应用等内容。 《Linux/UNIX系统编程手册(上、下册)》在汇聚大批 Linux专有特性(epoll、inotify、/proc)的同时,还特意强化了对UNIX标准(POSIX、SUS)的论述,彻底达到了“鱼与熊掌,二者得兼”的效果,这也堪称本书的**大亮点。 《Linux/UNIX系统编程手册(上、下册)》布局合理,论述清晰,说理透彻,尤其是作者对示例代码的构思巧妙,独具匠心,仔细研读定会受益良多。本书适合从事Linux/UNIX系统开发、运维工作的技术人员阅读,同时也可作为高校计算机专业学生的参考研习资料。 《Linux/UNIX系统编程手册(套装上下册)》图书目录 上册 第1章 历史和标准 1.1 UNIX和C语言简史 1.2 Linux简史 1.2.1 GNU项目 1.2.2 Linux内核 1.3 标准化 1.3.1 C编程语言 1.3.2 首个POSIX标准 1.3.3 X/Open公司和The Open Group 1.3.4 SUSv3和POSIX.1-2001 1.3.5 SUSv4和POSIX.1-2008 1.3.6 UNIX标准时间表 1.3.7 实现标准 1.3.8 Linux、标准、Linux标准规范(Linux Standard Base) 1.4 总结 第2章 基本概念 2.1 操作系统的核心-内核 2.2 shell 2.3 用户和组 2.4 单根目录层级、目录、链接及文件 2.5 文件I/O模型 2.6 程序 2.7 进程 2.8 内存映射 2.9 静态库和共享库 2.10 进程间通信及同步 2.11 信号 2.12 线程 2.13 进程组和shell任务控制 2.14 会话、控制终端和控制进程 2.15 伪终端 2.16 日期和时间 2.17 客户端服务器架构 2.18 实时性 2.19 /proc文件系统 2.20 总结 第3章 系统编程概念 3.1 系统调用 3.2 库函数 3.3 标准C语言函数库;GNU C语言函数库(glibc) 3.4 处理来自系统调用和库函数的错误 3.5 关于本书示例程序的注意事项 3.5.1 命令行选项及参数 3.5.2 常用的函数及头文件 3.6 可移植性问题 3.6.1 特性测试宏 3.6.2 系统数据类型 3.6.3 其他的可移植性问题 3.7 总结 3.8 练习 第4章 文件I/O:通用的I/O模型 4.1 概述 4.2 通用I/O 4.3 打开一个文件:open 4.3.1 open调用中的flags参数 4.3.2 open函数的错误 4.3.3 creat系统调用 4.4 读取文件内容:read 4.5 数据写入文件:write 4.6 关闭文件:close 4.7 改变文件偏移量:lseek 4.8 通用I/O模型以外的操作:ioctl 4.9 总结 4.10 练习 第5章 深入探究文件I/O 5.1 原子操作和竞争条件 5.2 文件控制操作:fcntl 5.3 打开文件的状态标志 5.4 文件描述符和打开文件之间的关系 5.5 复制文件描述符 5.6 在文件特定偏移量处的I/O:pread和pwrite 5.7 分散输入和集中输出(Scatter-Gather I/O):readv和writev 5.8 截断文件:truncate和ftruncate系统调用 5.9 非阻塞I/O 5.10 大文件I/O 5.11 /dev/fd目录 5.12 创建临时文件 5.13 总结 5.14 练习 第6章 进程 6.1 进程和程序 6.2 进程号和父进程号 6.3 进程内存布局 6.4 虚拟内存管理 6.5 栈和栈帧 6.6 命令行参数(argc, argv) 6.7 环境列表 6.8 执行非局部跳转:setjmp和longjmp 6.9 总结 6.9 练习 第7章 内存分配 7.1 在堆上分配内存 7.1.1 调整program break:brk和sbrk 7.1.2 在堆上分配内存:malloc和free 7.1.3 malloc和free的实现 7.1.4 在堆上分配内存的其他方法 7.2 在堆栈上分配内存:alloca 7.3 总结 7.4 练习 第8章 用户和组 8.1 密码文件:/etc/passwd 8.2 shadow密码文件:/etc/shadow 8.3 组文件:/etc/group 8.4 获取用户和组的信息 8.5 密码加密和用户认证 8.6 总结 8.7 练习 第9章 进程凭证 9.1 实际用户ID和实际组ID 9.2 有效用户ID和有效组ID 9.3 Set-User-ID和Set-Group-ID程序 9.4 保存set-user-ID和保存set-group-ID 9.5 文件系统用户ID和组ID 9.6 辅助组ID 9.7 获取和修改进程凭证 9.7.1 获取和修改实际、有效和保存设置标识 9.7.2 获取和修改文件系统ID 9.7.3 获取和修改辅助组ID 9.7.4 修改进程凭证的系统调用总结 9.7.5 示例:显示进程凭证 9.8 总结 9.9 习题 第10章 时间 10.1 日历时间(Calendar Time) 10.2 时间转换函数 10.2.1 将time_t转换为可打印格式 10.2.2 time_t和分解时间之间的转换 10.2.3 分解时间和打印格式之间的转换 10.3 时区 10.4 地区(Locale) 10.5 更新系统时钟 10.6 软件时钟(jiffies) 10.7 进程时间 10.8 总结 10.9 练习 第11章 系统限制和选项 11.1 系统限制 11.2 在运行时获取系统限制(和选项) 11.3 运行时获取与文件相关的限制(和选项) 11.4 不确定的限制 11.5 系统选项 11.6 总结 11.7 练习 第12章 系统和进程信息 12.1 /proc文件系统 12.1.1 获取与进程有关的信息:/proc/PID 12.1.2 /proc 目录下的系统信息 12.1.3 访问/proc文件 12.2 系统标识:uname 12.3 总结 12.4 练习 第13章 文件I/O缓冲 13.1 文件I/O的内核缓冲:缓冲区高速缓存 13.2 stdio库的缓冲 13.3 控制文件I/O的内核缓冲 13.4 I/O缓冲小结 13.5 就I/O模式向内核提出建议 13.6 绕过缓冲区高速缓存:直接I/O 13.7 混合使用库函数和系统调用进行文件I/O 13.8 总结 13.9 练习 第14章 系统编程概念 14.1 设备专用文件(设备文件) 14.2 磁盘和分区 14.3 文件系统 14.4 i节点 14.5 虚拟文件系统(VFS) 14.6 日志文件系统 14.7 单根目录层级和挂载点 14.8 文件系统的挂载和卸载 14.8.1 挂载文件系统:mount 14.8.2 卸载文件系统:umount和umount2 14.9 高级挂载特性 14.9.1 在多个挂载点挂载文件系统 14.9.2 多次挂载同一挂载点 14.9.3 基于每次挂载的挂载标志 14.9.4 绑定挂载 14.9.5 递归绑定挂载 14.10 虚拟内存文件系统:tmpfs 14.11 获得与文件系统有关的信息:statvfs 14.12 总结 14.13 练习 第15章 文件属性 15.1 获取文件信息:stat 15.2 文件时间戳 15.2.1 使用utime和utimes来改变文件时间戳 15.2.2 使用utimensat和futimens改变文件时间戳 15.3 文件属主 15.3.1 新建文件的属主 15.3.2 改变文件属主:chown、fchown和lchown 15.4 文件权限 15.4.1 普通文件的权限 15.4.2 目录权限 15.4.3 权限检查算法 15.4.4 检查对文件的访问权限:access 15.4.5 Set-User-ID、Set-Group-ID和Sticky位 15.4.6 进程的文件模式创建掩码:umask 15.4.7 更改文件权限:chmod和fchmod 15.5 I节点标志(ext2扩展文件属性) 15.6 总结 15.7 练习 第16章 扩展属性 16.1 概述 16.2 扩展属性的实现细节 16.3 操控扩展属性的系统调用 16.4 总结 16.5 练习 第17章 访问控制列表 17.1 概述 17.2 ACL权限检查算法 17.3 ACL的长、短文本格式 17.4 ACL_mask型ACE和ACL组分类 17.5 getfacl和setfacl命令 17.6 默认ACL与文件创建 17.7 ACL在实现方面的限制 17.8 ACL API 17.9 总结 17.10 练习 第18章 目录与链接 18.1 目录和(硬)链接 18.2 符号(软)链接 18.3 创建和移除(硬)链接:link和 unlink 18.4 更改文件名:rename 18.5 使用符号链接:symlink和readlink 18.6 创建和移除目录:mkdir和rmdir 18.7 移除一个文件或目录:remove 18.8 读目录:opendir和readdir 18.9 文件树遍历:nftw 18.10 进程的当前工作目录 18.11 针对目录文件描述符的相关操作 18.12 改变进程的根目录:chroot 18.13 解析路径名:realpath 18.14 解析路径名字符串:dirname和basename 18.15 总结 18.16 练习 第19章 监控文件事件 19.1 概述 19.2 inotify API 19.3 inotify事件 19.4 读取inotify事件 19.5 队列限制和/proc文件 19.6 监控文件的旧有系统:dnotify 19.7 总结 19.8 练习 第20章 信号:基本概念 20.1 概念和概述 20.2 信号类型和默认行为 20.3 改变信号处置:signal 20.4 信号处理器简介 20.5 发送信号:kill 20.6 检查进程的存在 20.7 发送信号的其他方式:raise和killpg 20.8 显示信号描述 20.9 信号集 20.10 信号掩码(阻塞信号传递) 20.11 处于等待状态的信号 20.12 不对信号进行排队处理 20.13 改变信号处置:sigaction 20.14 等待信号:pause 20.15 总结 20.16 练习 第21章 信号:信号处理器函数 21.1 设计信号处理器函数 21.1.1 再论信号的非队列化处理 21.1.2 可重入函数和异步信号安全函数 21.1.3 全局变量和sig_atomic_t数据类型 21.2 终止信号处理器函数的其他方法 21.2.1 在信号处理器函数中执行非本地跳转 21.2.2 异常终止进程:abort 21.3 在备选栈中处理信号:sigaltstack 21.4 SA_SIGINFO标志 21.5 系统调用的中断和重启 21.6 总结 21.7 练习 第22章 信号:高级特性 22.1 核心转储文件 22.2 传递、处置及处理的特殊情况 22.3 可中断和不可中断的进程睡眠状态 22.4 硬件产生的信号 22.5 信号的同步生成和异步生成 22.6 信号传递的时机与顺序 22.7 signal的实现及可移植性 22.8 实时信号 22.8.1 发送实时信号 22.8.2 处理实时信号 22.9 使用掩码来等待信号:sigsuspend 22.10 以同步方式等待信号 22.11 通过文件描述符来获取信号 22.12 利用信号进行进程间通信 22.13 早期的信号API(System V和BSD) 22.14 总结 22.15 练习 第23章 定时器与休眠 23.1 间隔定时器 23.2 定时器的调度及精度 23.3 为阻塞操作设置超时 23.4 暂停运行(休眠)一段固定时间 23.4.1 低分辨率休眠:sleep 23.4.2 高分辨率休眠:nanosleep 23.5 POSIX时钟 23.5.1 获取时钟的值:clock_gettime 23.5.2 设置时钟的值:clock_settime 23.5.3 获取特定进程或线程的时钟ID 23.5.4 高分辨率休眠的改进版:clock_nanosleep 23.6 POSIX间隔式定时器 23.6.1 创建定时器:timer_create 23.6.2 配备和解除定时器:timer_settime 23.6.3 获取定时器的当前值:timer_gettime 23.6.4 删除定时器:timer_delete 23.6.5 通过信号发出通知 23.6.6 定时器溢出 23.6.7 通过线程来通知 23.7 利用文件描述符进行通知的定时器:timerfd API 23.8 总结 23.9 练习 第24章 进程的创建 24.1 fork、exit、wait以及execve的简介 24.2 创建新进程:fork 24.2.1 父、子进程间的文件共享 24.2.2 fork的内存语义 24.3 系统调用vfork 24.4 fork之后的竞争条件(Race Condition) 24.5 同步信号以规避竞争条件 24.6 总结 24.7 练习 第25章 进程的终止 25.1 进程的终止:_exit和exit 25.2 进程终止的细节 25.3 退出处理程序 25.4 fork、stdio缓冲区以及_exit之间的交互 25.5 总结 25.6 练习 第26章 监控子进程 26.1 等待子进程 26.1.1 系统调用wait 26.1.2 系统调用waitpid 26.1.3 等待状态值 26.1.4 从信号处理程序中终止进程 26.1.5 系统调用waitid 26.1.6 系统调用wait3和wait4 26.2 孤儿进程与僵尸进程 26.3 SIGCHLD信号 26.3.1 为SIGCHLD建立信号处理程序 26.3.2 向已停止的子进程发送SIGCHLD信号 26.3.3 忽略终止的子进程 26.4 总结 26.5 练习 第27章 程序的执行 27.1 执行新程序:execve 27.2 exec库函数 27.2.1 环境变量PATH 27.2.2 将程序参数指定为列表 27.2.3 将调用者的环境传递给新程序 27.2.4 执行由文件描述符指代的程序:fexecve 27.3 解释器脚本 27.4 文件描述符与exec 27.5 信号与exec 27.6 执行shell命令:system 27.7 system的实现 27.8 总结 27.9 练习 第28章 详述进程创建和程序执行 28.1 进程记账 28.2 系统调用clone 28.2.1 clone的flags参数 28.2.2 因克隆生成的子进程而对waitpid进行的扩展 28.3 进程的创建速度 28.4 exec和fork对进程属性的影响 28.5 总结 28.6 练习 第29章 线程:介绍 29.1 概述 29.2 Pthreads API的详细背景 29.3 创建线程 29.4 终止线程 29.5 线程ID(Thread ID) 29.6 连接(joining)已终止的线程 29.7 线程的分离 29.8 线程属性 29.9 线程VS进程 29.10 总结 29.11 练习 第30章 线程:线程同步 30.1 保护对共享变量的访问:互斥量 30.1.1 静态分配的互斥量 30.1.2 加锁和解锁互斥量 30.1.3 互斥量的性能 30.1.4 互斥量的死锁 30.1.5 动态初始化互斥量 30.1.6 互斥量的属性 30.1.7 互斥量类型 30.2 通知状态的改变:条件变量(Condition Variable) 30.2.1 由静态分配的条件变量 30.2.2 通知和等待条件变量 30.2.3 测试条件变量的判断条件(predicate) 30.2.4 示例程序:连接任意已终止线程 30.2.5 经由动态分配的条件变量 30.3 总结 30.4 练习 第31章 线程:线程安全和每线程存储 31.1 线程安全(再论可重入性) 31.2 一次性初始化 31.3 线程特有数据 31.3.1 库函数视角下的线程特有数据 31.3.2 线程特有数据API概述 31.3.3 线程特有数据API详述 31.3.4 使用线程特有数据API 31.3.5 线程特有数据的实现限制 31.4 线程局部存储 31.5 总结 31.6 练习 第32章 线程:线程取消 32.1 取消一个线程 32.2 取消状态及类型 32.3 取消点 32.4 线程可取消性的检测 32.5 清理函数(cleanup handler) 32.6 异步取消 32.7 总结 第33章 线程:更多细节 33.1 线程栈 33.2 线程和信号 33.2.1 UNIX信号模型如何映射到线程中 33.2.2 操作线程信号掩码 33.2.3 向线程发送信号 33.2.4 妥善处理异步信号 33.3 线程和进程控制 33.4 线程实现模型 33.5 Linux POSIX线程的实现 33.5.1 LinuxThreads 33.5.2 NPTL 33.5.3 哪一种线程实现 33.6 Pthread API的高级特性 33.7 总结 33.8 练习 下册 第34章 进程组、会话和作业控制 34.1 概述 34.2 进程组 34.3 会话 34.4 控制终端和控制进程 34.5 前台和后台进程组 34.6 SIGHUP信号 34.6.1 在shell中处理SIGHUP信号 34.6.2 SIGHUP和控制进程的终止 34.7 作业控制 34.7.1 在shell中使用作业控制 34.7.2 实现作业控制 34.7.3 处理作业控制信号 34.7.4 孤儿进程组(SIGHUP回顾) 34.8 总结 34.9 习题 第35章 进程优先级和调度 35.1 进程优先级(nice值) 35.2 实时进程调度概述 35.2.1 SCHED_RR策略 35.2.2 SCHED_FIFO策略 35.2.3 SCHED_BATCH和SCHED_IDLE策略 35.3 实时进程调用API 35.3.1 实时优先级范围 35.3.2 修改和获取策略和优先级 35.3.3 释放CPU 35.3.4 SCHED_RR时间片 35.4 CPU亲和力 35.5 总结 35.6 习题 第36章 进程资源 36.1 进程资源使用 36.2 进程资源限制 36.3 特定资源限制细节 36.4 总结 36.5 习题 第37章 DAEMON 37.1 概述 37.2 创建一个daemon 37.3 编写daemon指南 37.4 使用SIGHUP重新初始化一个daemon 37.5 使用syslog记录消息和错误 37.5.1 概述 37.5.2 syslog API 37.5.3 /etc/syslog.conf文件 37.6 总结 37.7 习题 第38章 编写安全的特权程序 38.1 是否需要一个Set-User-ID或Set-Group-ID程序? 38.2 以最小权限操作 38.3 小心执行程序 38.4 避免暴露敏感信息 38.5 确定进程的边界 38.6 小心信号和竞争条件 38.7 执行文件操作和文件I/O的缺陷 38.8 不要完全相信输入和环境 38.9 小心缓冲区溢出 38.10 小心拒绝服务攻击 38.11 检查返回状态和安全地处理失败情况 38.12 总结 38.13 习题 第39章 能力 39.1 能力基本原理 39.2 Linux能力 39.3 进程和文件能力 39.3.1 进程能力 39.3.2 文件能力 39.3.3 进程许可和有效能力集的目的 39.3.4 文件许可和有效能力集的目的 39.3.5 进程和文件可继承集的目的 39.3.6 在shell中给文件赋予能力和查看文件能力 39.4 现代能力实现 39.5 在exec中转变进程能力 39.5.1 能力边界集 39.5.2 保持root语义 39.6 改变用户ID对进程能力的影响 39.7 用编程的方式改变进程能力 39.8 创建仅包含能力的环境 39.9 发现程序所需的能力 39.10 不具备文件能力的老式内核和系统 39.11 总结 39.12 习题 第40章 登录记账 40.1 utmp和wtmp文件概述 40.2 utmpx API 40.3 utmpx结构 40.4 从utmp和wtmp文件中检索信息 40.5 获取登录名称:getlogin 40.6 为登录会话更新utmp和wtmp文件 40.7 lastlog文件 40.8 总结 40.9 习题 第41章 共享库基础 41.1 目标库 41.2 静态库 41.3 共享库概述 41.4 创建和使用共享库–首回合 41.4.1 创建一个共享库 41.4.2 位置独立的代码 41.4.3 使用一个共享库 41.4.4 共享库soname 41.5 使用共享库的有用工具 41.6 共享库版本和命名规则 41.7 安装共享库 41.8 兼容与不兼容库比较 41.9 升级共享库 41.10 在目标文件中指定库搜索目录 41.11 在运行时找出共享库 41.12 运行时符号解析 41.13 使用静态库取代共享库 41.14 总结 41.15 习题 第42章 共享库高级特性 42.1 动态加载库 42.1.1 打开共享库:dlopen 42.1.2 错误诊断:dlerror 42.1.3 获取符号的地址:dlsym 42.1.4 关闭共享库:dlclose 42.1.5 获取与加载的符号相关的信息:dladdr 42.1.6 在主程序中访问符号 42.2 控制符号的可见性 42.3 链接器版本脚本 42.3.1 使用版本脚本控制符号的可见性 42.3.2 符号版本化 42.4 初始化和终止函数 42.5 预加载共享库 42.6 监控动态链接器:LD_DEBUG 42.7 总结 42.8 习题 第43章 进程间通信简介 43.1 IPC工具分类 43.2 通信工具 43.3 同步工具 43.4 IPC工具比较 43.5 总结 43.6 习题 第44章 管道和FIFO 44.1 概述 44.2 创建和使用管道 44.3 将管道作为一种进程同步的方法 44.4 使用管道连接过滤器 44.5 通过管道与Shell命令进行通信:popen 44.6 管道和stdio缓冲 44.7 FIFO 44.8 使用管道实现一个客户端/服务器应用程序 44.9 非阻塞I/O 44.10 管道和FIFO中read和write的语义 44.11 总结 44.12 习题 第45章 System V IPC介绍 45.1 概述 45.2 IPC Key 45.3 关联数据结构和对象权限 45.4 IPC标识符和客户端/服务器应用程序 45.5 System V IPC get调用使用的算法 45.6 ipcs和ipcrm命令 45.7 获取所有IPC对象列表 45.8 IPC限制 45.9 总结 45.10 习题 第46章 System V消息队列 46.1 创建或打开一个消息队列 46.2 交换消息 46.2.1 发送消息 46.2.2 接收消息 46.3 消息队列控制操作 46.4 消息队列关联数据结构 46.5 消息队列的限制 46.6 显示系统中所有消息队列 46.7 使用消息队列实现客户端/服务器应用程序 46.8 使用消息队列实现文件服务器应用程序 46.9 System V消息队列的缺点 46.10 总结 46.11 习题 第47章 System V信号量 47.1 概述 47.2 创建或打开一个信号量集 47.3 信号量控制操作 47.4 信号量关联数据结构 47.5 信号量初始化 47.6 信号量操作 47.7 多个阻塞信号量操作的处理 47.8 信号量撤销值 47.9 实现一个二元信号量协议 47.10 信号量限制 47.11 System V信号量的缺点 47.12 总结 47.13 习题 第48章 System V共享内存 48.1 概述 48.2 创建或打开一个共享内存段 48.3 使用共享内存 48.4 示例:通过共享内存传输数据 48.5 共享内存在虚拟内存中的位置 48.6 在共享内存中存储指针 48.7 共享内存控制操作 48.8 共享内存关联数据结构 48.9 共享内存的限制 48.10 总结 48.11 习题 第49章 内存映射 49.1 概述 49.2 创建一个映射:mmap 49.3 解除映射区域:munmap 49.4 文件映射 49.4.1 私有文件映射 49.4.2 共享文件映射 49.4.3 边界情况 49.4.4 内存保护和文件访问模式交互 49.5 同步映射区域:msync 49.6 其他mmap标记 49.7 匿名映射 49.8 重新映射一个映射区域:mremap 49.9 MAP_NORESERVE和过度利用交换空间 49.10 MAP_FIXED标记 49.11 非线性映射:remap_file_pages 49.12 总结 49.13 习题 第50章 虚拟内存操作 50.1 改变内存保护:mprotect 50.2 内存锁:mlock和mlockatt 50.3 确定内存驻留性:mincore 50.4 建议后续的内存使用模式:madvise 50.5 小结 50.6 习题 第51章 POSIX IPC介绍 51.1 API概述 51.2 System V IPC与POSIX IPC比较 51.3 总结 第52章 POSIX消息队列 52.1 概述 52.2 打开、关闭和断开链接消息队列 52.3 描述符和消息队列之间的关系 52.4 消息队列特性 52.5 交换消息 52.5.1 发送消息 52.5.2 接收消息 52.5.3 在发送和接收消息时设置超时时间 52.6 消息通知 52.6.1 通过信号接收通知 52.6.2 通过线程接收通知 52.7 Linux特有的特性 52.8 消息队列限制 52.9 POSIX和System V消息队列比较 52.10 总结 52.11 习题 第53章 POSIX信号量 53.1 概述 53.2 命名信号量 53.2.1 打开一个命名信号量 53.2.2 关闭一个信号量 53.2.3 删除一个命名信号量 53.3 信号量操作 53.3.1 等待一个信号量 53.3.2 发布一个信号量 53.3.3 获取信号量的当前值 53.4 未命名信号量 53.4.1 初始化一个未命名信号量 53.4.2 销毁一个未命名信号量 53.5 与其他同步技术比较 53.6 信号量的限制 53.7 总结 53.8 习题 第54章 POSIX共享内存 54.1 概述 54.2 创建共享内存对象 54.3 使用共享内存对象 54.4 删除共享内存对象 54.5 共享内存APIs比较 54.6 总结 54.7 习题 第55章 文件加锁 55.1 概述 55.2 使用flock给文件加锁 55.2.1 锁继承与释放的语义 55.2.2 flock的限制 55.3 使用fcntl给记录加锁 55.3.1 死锁 55.3.2 示例:一个交互式加锁程序 55.3.3 示例:一个加锁函数库 55.3.4 锁的限制和性能 55.3.5 锁继承和释放的语义 55.3.6 锁定饿死和排队加锁请求的优先级 55.4 强制加锁 55.5 /proc/locks文件 55.6 仅运行一个程序的单个实例 55.7 老式加锁技术 55.8 总结 55.9 习题 第56章 SOCKET:介绍 56.1 概述 56.2 创建一个socket:socket 56.3 将socket绑定到地址:bind 56.4 通用socket地址结构:struct sockaddr 56.5 流socket 56.5.1 监听接入连接:listen 56.5.2 接受连接:accept 56.5.3 连接到对等socket:connect 56.5.4 流socket I/O 56.5.5 连接终止:close 56.6 数据报socket 56.6.1 交换数据报:recvfrom和sendto 56.6.2 在数据报socket上使用connect 56.7 总结 第57章 SOCKET:UNIX DOMAIN 57.1 UNIX domain socket地址:struct sockaddr_un 57.2 UNIX domain中的流socket 57.3 UNIX domain中的数据报socket 57.4 UNIX domain socket权限 57.5 创建互联socket对:socketpair 57.6 Linux抽象socket名空间 57.7 总结 57.8 习题 第58章 SOCKET:TCP/IP网络基础 58.1 因特网 58.2 联网协议和层 58.3 数据链路层 58.4 网络层:IP 58.5 IP地址 58.6 传输层 58.6.1 端口号 58.6.2 用户数据报协议(UDP) 58.6.3 传输控制协议(TCP) 58.7 请求注解(RFC) 58.8 总结 第59章 SOCKET:Internet DOMAIN 59.1 Internet domain socket 59.2 网络字节序 59.3 数据表示 59.4 Internet socket地址 59.5 主机和服务转换函数概述 59.6 inet_pton和inet_ntop函数 59.7 客户端-服务器示例(数据报socket) 59.8 域名系统(DNS) 59.9 /etc/services文件 59.10 独立于协议的主机和服务转换 59.10.1 getaddrinfo函数 59.10.2 释放addrinfo列表:freeaddrinfo 59.10.3 错误诊断:gai_strerror 59.10.4 getnameinfo函数 59.11 客户端-服务器示例(流式socket) 59.12 Internet domain socket库 59.13 过时的主机和服务转换API 59.13.1 inet_aton和inet_ntoa函数 59.13.2 gethostbyname和gethostbyaddr函数 59.13.3 getserverbyname和getserverbyport函数 59.14 UNIX与Internet domain socket比较 59.15 更多信息 59.16 总结 59.17 习题 第60章 SOCKET:服务器设计 60.1 迭代型和并发型服务器 60.2 迭代型UDP echo服务器 60.3 并发型TCP echo服务器 60.4 并发型服务器的其他设计方案 60.5 inetd(Internet超级服务器)守护进程 60.6 总结 60.7 练习 第61章 SOCKET:高级主题 61.1 流式套接字上的部分读和部分写 61.2 shutdown系统调用 61.3 专用于套接字的I/O系统调用:recv和send 61.4 sendfile系统调用 61.5 获取套接字地址 61.6 深入探讨TCP协议 61.6.1 TCP报文的格式 61.6.2 TCP序列号和确认机制 61.6.3 TCP协议状态机以及状态迁移图 61.6.4 TCP连接的建立 61.6.5 TCP连接的终止 61.6.6 在TCP套接字上调用shutdown 61.6.7 TIME_WAIT状态 61.7 监视套接字:netstat 61.8 使用tcpdump来监视TCP流量 61.9 套接字选项 61.10 SO_REUSEADDR套接字选项 61.11 在accept中继承标记和选项 61.12 TCP vs UDP 61.13 高级功能 61.13.1 带外数据 61.13.2 sendmsg和recvmsg系统调用 61.13.3 传递文件描述符 61.13.4 接收发送端的凭据 61.13.5 顺序数据包套接字 61.13.6 SCTP以及DCCP传输层协议 61.14 总结 61.15 练习 第62章 终端 62.1 整体概览 62.2 获取和修改终端属性 62.3 stty命令 62.4 终端特殊字符 62.5 终端标志 62.6 终端的I/O模式 62.6.1 规范模式 62.6.2 非规范模式 62.6.3 加工模式、cbreak模式以及原始模式 62.7 终端线速(比特率) 62.8 终端的行控制 62.9 终端窗口大小 62.10 终端标识 62.11 总结 62.12 练习 第63章 其他备选的I/O模型 63.1 整体概览 63.1.1 水平触发和边缘触发 63.1.2 在备选的I/O模型中采用非阻塞I/O 63.2 I/O多路复用 63.2.1 select系统调用 63.2.2 poll系统调用 63.2.3 文件描述符何时就绪? 63.2.4 比较select和poll 63.2.5 select和poll存在的问题 63.3 信号驱动I/O 63.3.1 何时发送”I/O就绪”信号 63.3.2 优化信号驱动I/O的使用 63.4 epoll编程接口 63.4.1 创建epoll实例:epoll_create 63.4.2 修改epoll的兴趣列表:epoll_ctl 63.4.3 事件等待:epoll_wait 63.4.4 深入探究epoll的语义 63.4.5 epoll同I/O多路复用的性能对比 63.4.6 边缘触发通知 63.5 在信号和文件描述符上等待 63.5.1 pselect系统调用 63.5.2 self-pipe技巧 63.6 总结 63.7 练习 第64章 伪终端 64.1 整体概览 64.2 UNIX98伪终端 64.2.1 打开未使用的主设备:posix_openpt 64.2.2 修改从设备属主和权限:grantpt 64.2.3 解锁从设备:unlockpt 64.2.4 获取从设备名称:ptsname 64.3 打开主设备:ptyMasterOpen 64.4 将进程连接到伪终端:ptyFork 64.5 伪终端I/O 64.6 实现script(1)程序 64.7 终端属性和窗口大小 64.8 BSD风格的伪终端 64.9 总结 64.10 练习 附录A 跟踪系统调用 附录B 解析命令行选项 附录C 对NULL指针做转型 附录D 内核配置 附录E 更多信息源 附录F 部分习题解答

2018-02-15

Linux_UNIX系统编程手册-上册(NEW)

《Linux/UNIX系统编程手册(套装上下册)》,人民邮电出版社出版,外文书名: The Linux Programming Interface。作者:凯利斯克 (Michael Kerrisk) (作者),‎ 孙剑 (译者),‎ 许从年 (译者),‎ 董健 (译者),‎ 孙余强 (译者),‎ 等。《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权 威著作。Linux编程资 深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。《Linux/UNIX系统编程手册(上、下册)》涵盖了逾500个系统调用及库函数,并给出逾200个程序示例,另含88张表格和115幅示意图。 《Linux/UNIX系统编程手册(上、下册)》总共分为64章,主要讲解了高效读写文件,对信号、时钟和定时器的运用,创建进程、执行程序,编写安全的应用程序,运用POSIX线程技术编写多线程程序,创建和使用共享库,运用管道、消息队列、共享内存和信号量技术来进行进程间通信,以及运用套接字API编写网络应用等内容。 《Linux/UNIX系统编程手册(上、下册)》在汇聚大批 Linux专有特性(epoll、inotify、/proc)的同时,还特意强化了对UNIX标准(POSIX、SUS)的论述,彻底达到了“鱼与熊掌,二者得兼”的效果,这也堪称本书的**大亮点。 《Linux/UNIX系统编程手册(上、下册)》布局合理,论述清晰,说理透彻,尤其是作者对示例代码的构思巧妙,独具匠心,仔细研读定会受益良多。本书适合从事Linux/UNIX系统开发、运维工作的技术人员阅读,同时也可作为高校计算机专业学生的参考研习资料。 《Linux/UNIX系统编程手册(套装上下册)》图书目录 上册 第1章 历史和标准 1.1 UNIX和C语言简史 1.2 Linux简史 1.2.1 GNU项目 1.2.2 Linux内核 1.3 标准化 1.3.1 C编程语言 1.3.2 首个POSIX标准 1.3.3 X/Open公司和The Open Group 1.3.4 SUSv3和POSIX.1-2001 1.3.5 SUSv4和POSIX.1-2008 1.3.6 UNIX标准时间表 1.3.7 实现标准 1.3.8 Linux、标准、Linux标准规范(Linux Standard Base) 1.4 总结 第2章 基本概念 2.1 操作系统的核心-内核 2.2 shell 2.3 用户和组 2.4 单根目录层级、目录、链接及文件 2.5 文件I/O模型 2.6 程序 2.7 进程 2.8 内存映射 2.9 静态库和共享库 2.10 进程间通信及同步 2.11 信号 2.12 线程 2.13 进程组和shell任务控制 2.14 会话、控制终端和控制进程 2.15 伪终端 2.16 日期和时间 2.17 客户端服务器架构 2.18 实时性 2.19 /proc文件系统 2.20 总结 第3章 系统编程概念 3.1 系统调用 3.2 库函数 3.3 标准C语言函数库;GNU C语言函数库(glibc) 3.4 处理来自系统调用和库函数的错误 3.5 关于本书示例程序的注意事项 3.5.1 命令行选项及参数 3.5.2 常用的函数及头文件 3.6 可移植性问题 3.6.1 特性测试宏 3.6.2 系统数据类型 3.6.3 其他的可移植性问题 3.7 总结 3.8 练习 第4章 文件I/O:通用的I/O模型 4.1 概述 4.2 通用I/O 4.3 打开一个文件:open 4.3.1 open调用中的flags参数 4.3.2 open函数的错误 4.3.3 creat系统调用 4.4 读取文件内容:read 4.5 数据写入文件:write 4.6 关闭文件:close 4.7 改变文件偏移量:lseek 4.8 通用I/O模型以外的操作:ioctl 4.9 总结 4.10 练习 第5章 深入探究文件I/O 5.1 原子操作和竞争条件 5.2 文件控制操作:fcntl 5.3 打开文件的状态标志 5.4 文件描述符和打开文件之间的关系 5.5 复制文件描述符 5.6 在文件特定偏移量处的I/O:pread和pwrite 5.7 分散输入和集中输出(Scatter-Gather I/O):readv和writev 5.8 截断文件:truncate和ftruncate系统调用 5.9 非阻塞I/O 5.10 大文件I/O 5.11 /dev/fd目录 5.12 创建临时文件 5.13 总结 5.14 练习 第6章 进程 6.1 进程和程序 6.2 进程号和父进程号 6.3 进程内存布局 6.4 虚拟内存管理 6.5 栈和栈帧 6.6 命令行参数(argc, argv) 6.7 环境列表 6.8 执行非局部跳转:setjmp和longjmp 6.9 总结 6.9 练习 第7章 内存分配 7.1 在堆上分配内存 7.1.1 调整program break:brk和sbrk 7.1.2 在堆上分配内存:malloc和free 7.1.3 malloc和free的实现 7.1.4 在堆上分配内存的其他方法 7.2 在堆栈上分配内存:alloca 7.3 总结 7.4 练习 第8章 用户和组 8.1 密码文件:/etc/passwd 8.2 shadow密码文件:/etc/shadow 8.3 组文件:/etc/group 8.4 获取用户和组的信息 8.5 密码加密和用户认证 8.6 总结 8.7 练习 第9章 进程凭证 9.1 实际用户ID和实际组ID 9.2 有效用户ID和有效组ID 9.3 Set-User-ID和Set-Group-ID程序 9.4 保存set-user-ID和保存set-group-ID 9.5 文件系统用户ID和组ID 9.6 辅助组ID 9.7 获取和修改进程凭证 9.7.1 获取和修改实际、有效和保存设置标识 9.7.2 获取和修改文件系统ID 9.7.3 获取和修改辅助组ID 9.7.4 修改进程凭证的系统调用总结 9.7.5 示例:显示进程凭证 9.8 总结 9.9 习题 第10章 时间 10.1 日历时间(Calendar Time) 10.2 时间转换函数 10.2.1 将time_t转换为可打印格式 10.2.2 time_t和分解时间之间的转换 10.2.3 分解时间和打印格式之间的转换 10.3 时区 10.4 地区(Locale) 10.5 更新系统时钟 10.6 软件时钟(jiffies) 10.7 进程时间 10.8 总结 10.9 练习 第11章 系统限制和选项 11.1 系统限制 11.2 在运行时获取系统限制(和选项) 11.3 运行时获取与文件相关的限制(和选项) 11.4 不确定的限制 11.5 系统选项 11.6 总结 11.7 练习 第12章 系统和进程信息 12.1 /proc文件系统 12.1.1 获取与进程有关的信息:/proc/PID 12.1.2 /proc 目录下的系统信息 12.1.3 访问/proc文件 12.2 系统标识:uname 12.3 总结 12.4 练习 第13章 文件I/O缓冲 13.1 文件I/O的内核缓冲:缓冲区高速缓存 13.2 stdio库的缓冲 13.3 控制文件I/O的内核缓冲 13.4 I/O缓冲小结 13.5 就I/O模式向内核提出建议 13.6 绕过缓冲区高速缓存:直接I/O 13.7 混合使用库函数和系统调用进行文件I/O 13.8 总结 13.9 练习 第14章 系统编程概念 14.1 设备专用文件(设备文件) 14.2 磁盘和分区 14.3 文件系统 14.4 i节点 14.5 虚拟文件系统(VFS) 14.6 日志文件系统 14.7 单根目录层级和挂载点 14.8 文件系统的挂载和卸载 14.8.1 挂载文件系统:mount 14.8.2 卸载文件系统:umount和umount2 14.9 高级挂载特性 14.9.1 在多个挂载点挂载文件系统 14.9.2 多次挂载同一挂载点 14.9.3 基于每次挂载的挂载标志 14.9.4 绑定挂载 14.9.5 递归绑定挂载 14.10 虚拟内存文件系统:tmpfs 14.11 获得与文件系统有关的信息:statvfs 14.12 总结 14.13 练习 第15章 文件属性 15.1 获取文件信息:stat 15.2 文件时间戳 15.2.1 使用utime和utimes来改变文件时间戳 15.2.2 使用utimensat和futimens改变文件时间戳 15.3 文件属主 15.3.1 新建文件的属主 15.3.2 改变文件属主:chown、fchown和lchown 15.4 文件权限 15.4.1 普通文件的权限 15.4.2 目录权限 15.4.3 权限检查算法 15.4.4 检查对文件的访问权限:access 15.4.5 Set-User-ID、Set-Group-ID和Sticky位 15.4.6 进程的文件模式创建掩码:umask 15.4.7 更改文件权限:chmod和fchmod 15.5 I节点标志(ext2扩展文件属性) 15.6 总结 15.7 练习 第16章 扩展属性 16.1 概述 16.2 扩展属性的实现细节 16.3 操控扩展属性的系统调用 16.4 总结 16.5 练习 第17章 访问控制列表 17.1 概述 17.2 ACL权限检查算法 17.3 ACL的长、短文本格式 17.4 ACL_mask型ACE和ACL组分类 17.5 getfacl和setfacl命令 17.6 默认ACL与文件创建 17.7 ACL在实现方面的限制 17.8 ACL API 17.9 总结 17.10 练习 第18章 目录与链接 18.1 目录和(硬)链接 18.2 符号(软)链接 18.3 创建和移除(硬)链接:link和 unlink 18.4 更改文件名:rename 18.5 使用符号链接:symlink和readlink 18.6 创建和移除目录:mkdir和rmdir 18.7 移除一个文件或目录:remove 18.8 读目录:opendir和readdir 18.9 文件树遍历:nftw 18.10 进程的当前工作目录 18.11 针对目录文件描述符的相关操作 18.12 改变进程的根目录:chroot 18.13 解析路径名:realpath 18.14 解析路径名字符串:dirname和basename 18.15 总结 18.16 练习 第19章 监控文件事件 19.1 概述 19.2 inotify API 19.3 inotify事件 19.4 读取inotify事件 19.5 队列限制和/proc文件 19.6 监控文件的旧有系统:dnotify 19.7 总结 19.8 练习 第20章 信号:基本概念 20.1 概念和概述 20.2 信号类型和默认行为 20.3 改变信号处置:signal 20.4 信号处理器简介 20.5 发送信号:kill 20.6 检查进程的存在 20.7 发送信号的其他方式:raise和killpg 20.8 显示信号描述 20.9 信号集 20.10 信号掩码(阻塞信号传递) 20.11 处于等待状态的信号 20.12 不对信号进行排队处理 20.13 改变信号处置:sigaction 20.14 等待信号:pause 20.15 总结 20.16 练习 第21章 信号:信号处理器函数 21.1 设计信号处理器函数 21.1.1 再论信号的非队列化处理 21.1.2 可重入函数和异步信号安全函数 21.1.3 全局变量和sig_atomic_t数据类型 21.2 终止信号处理器函数的其他方法 21.2.1 在信号处理器函数中执行非本地跳转 21.2.2 异常终止进程:abort 21.3 在备选栈中处理信号:sigaltstack 21.4 SA_SIGINFO标志 21.5 系统调用的中断和重启 21.6 总结 21.7 练习 第22章 信号:高级特性 22.1 核心转储文件 22.2 传递、处置及处理的特殊情况 22.3 可中断和不可中断的进程睡眠状态 22.4 硬件产生的信号 22.5 信号的同步生成和异步生成 22.6 信号传递的时机与顺序 22.7 signal的实现及可移植性 22.8 实时信号 22.8.1 发送实时信号 22.8.2 处理实时信号 22.9 使用掩码来等待信号:sigsuspend 22.10 以同步方式等待信号 22.11 通过文件描述符来获取信号 22.12 利用信号进行进程间通信 22.13 早期的信号API(System V和BSD) 22.14 总结 22.15 练习 第23章 定时器与休眠 23.1 间隔定时器 23.2 定时器的调度及精度 23.3 为阻塞操作设置超时 23.4 暂停运行(休眠)一段固定时间 23.4.1 低分辨率休眠:sleep 23.4.2 高分辨率休眠:nanosleep 23.5 POSIX时钟 23.5.1 获取时钟的值:clock_gettime 23.5.2 设置时钟的值:clock_settime 23.5.3 获取特定进程或线程的时钟ID 23.5.4 高分辨率休眠的改进版:clock_nanosleep 23.6 POSIX间隔式定时器 23.6.1 创建定时器:timer_create 23.6.2 配备和解除定时器:timer_settime 23.6.3 获取定时器的当前值:timer_gettime 23.6.4 删除定时器:timer_delete 23.6.5 通过信号发出通知 23.6.6 定时器溢出 23.6.7 通过线程来通知 23.7 利用文件描述符进行通知的定时器:timerfd API 23.8 总结 23.9 练习 第24章 进程的创建 24.1 fork、exit、wait以及execve的简介 24.2 创建新进程:fork 24.2.1 父、子进程间的文件共享 24.2.2 fork的内存语义 24.3 系统调用vfork 24.4 fork之后的竞争条件(Race Condition) 24.5 同步信号以规避竞争条件 24.6 总结 24.7 练习 第25章 进程的终止 25.1 进程的终止:_exit和exit 25.2 进程终止的细节 25.3 退出处理程序 25.4 fork、stdio缓冲区以及_exit之间的交互 25.5 总结 25.6 练习 第26章 监控子进程 26.1 等待子进程 26.1.1 系统调用wait 26.1.2 系统调用waitpid 26.1.3 等待状态值 26.1.4 从信号处理程序中终止进程 26.1.5 系统调用waitid 26.1.6 系统调用wait3和wait4 26.2 孤儿进程与僵尸进程 26.3 SIGCHLD信号 26.3.1 为SIGCHLD建立信号处理程序 26.3.2 向已停止的子进程发送SIGCHLD信号 26.3.3 忽略终止的子进程 26.4 总结 26.5 练习 第27章 程序的执行 27.1 执行新程序:execve 27.2 exec库函数 27.2.1 环境变量PATH 27.2.2 将程序参数指定为列表 27.2.3 将调用者的环境传递给新程序 27.2.4 执行由文件描述符指代的程序:fexecve 27.3 解释器脚本 27.4 文件描述符与exec 27.5 信号与exec 27.6 执行shell命令:system 27.7 system的实现 27.8 总结 27.9 练习 第28章 详述进程创建和程序执行 28.1 进程记账 28.2 系统调用clone 28.2.1 clone的flags参数 28.2.2 因克隆生成的子进程而对waitpid进行的扩展 28.3 进程的创建速度 28.4 exec和fork对进程属性的影响 28.5 总结 28.6 练习 第29章 线程:介绍 29.1 概述 29.2 Pthreads API的详细背景 29.3 创建线程 29.4 终止线程 29.5 线程ID(Thread ID) 29.6 连接(joining)已终止的线程 29.7 线程的分离 29.8 线程属性 29.9 线程VS进程 29.10 总结 29.11 练习 第30章 线程:线程同步 30.1 保护对共享变量的访问:互斥量 30.1.1 静态分配的互斥量 30.1.2 加锁和解锁互斥量 30.1.3 互斥量的性能 30.1.4 互斥量的死锁 30.1.5 动态初始化互斥量 30.1.6 互斥量的属性 30.1.7 互斥量类型 30.2 通知状态的改变:条件变量(Condition Variable) 30.2.1 由静态分配的条件变量 30.2.2 通知和等待条件变量 30.2.3 测试条件变量的判断条件(predicate) 30.2.4 示例程序:连接任意已终止线程 30.2.5 经由动态分配的条件变量 30.3 总结 30.4 练习 第31章 线程:线程安全和每线程存储 31.1 线程安全(再论可重入性) 31.2 一次性初始化 31.3 线程特有数据 31.3.1 库函数视角下的线程特有数据 31.3.2 线程特有数据API概述 31.3.3 线程特有数据API详述 31.3.4 使用线程特有数据API 31.3.5 线程特有数据的实现限制 31.4 线程局部存储 31.5 总结 31.6 练习 第32章 线程:线程取消 32.1 取消一个线程 32.2 取消状态及类型 32.3 取消点 32.4 线程可取消性的检测 32.5 清理函数(cleanup handler) 32.6 异步取消 32.7 总结 第33章 线程:更多细节 33.1 线程栈 33.2 线程和信号 33.2.1 UNIX信号模型如何映射到线程中 33.2.2 操作线程信号掩码 33.2.3 向线程发送信号 33.2.4 妥善处理异步信号 33.3 线程和进程控制 33.4 线程实现模型 33.5 Linux POSIX线程的实现 33.5.1 LinuxThreads 33.5.2 NPTL 33.5.3 哪一种线程实现 33.6 Pthread API的高级特性 33.7 总结 33.8 练习 下册 第34章 进程组、会话和作业控制 34.1 概述 34.2 进程组 34.3 会话 34.4 控制终端和控制进程 34.5 前台和后台进程组 34.6 SIGHUP信号 34.6.1 在shell中处理SIGHUP信号 34.6.2 SIGHUP和控制进程的终止 34.7 作业控制 34.7.1 在shell中使用作业控制 34.7.2 实现作业控制 34.7.3 处理作业控制信号 34.7.4 孤儿进程组(SIGHUP回顾) 34.8 总结 34.9 习题 第35章 进程优先级和调度 35.1 进程优先级(nice值) 35.2 实时进程调度概述 35.2.1 SCHED_RR策略 35.2.2 SCHED_FIFO策略 35.2.3 SCHED_BATCH和SCHED_IDLE策略 35.3 实时进程调用API 35.3.1 实时优先级范围 35.3.2 修改和获取策略和优先级 35.3.3 释放CPU 35.3.4 SCHED_RR时间片 35.4 CPU亲和力 35.5 总结 35.6 习题 第36章 进程资源 36.1 进程资源使用 36.2 进程资源限制 36.3 特定资源限制细节 36.4 总结 36.5 习题 第37章 DAEMON 37.1 概述 37.2 创建一个daemon 37.3 编写daemon指南 37.4 使用SIGHUP重新初始化一个daemon 37.5 使用syslog记录消息和错误 37.5.1 概述 37.5.2 syslog API 37.5.3 /etc/syslog.conf文件 37.6 总结 37.7 习题 第38章 编写安全的特权程序 38.1 是否需要一个Set-User-ID或Set-Group-ID程序? 38.2 以最小权限操作 38.3 小心执行程序 38.4 避免暴露敏感信息 38.5 确定进程的边界 38.6 小心信号和竞争条件 38.7 执行文件操作和文件I/O的缺陷 38.8 不要完全相信输入和环境 38.9 小心缓冲区溢出 38.10 小心拒绝服务攻击 38.11 检查返回状态和安全地处理失败情况 38.12 总结 38.13 习题 第39章 能力 39.1 能力基本原理 39.2 Linux能力 39.3 进程和文件能力 39.3.1 进程能力 39.3.2 文件能力 39.3.3 进程许可和有效能力集的目的 39.3.4 文件许可和有效能力集的目的 39.3.5 进程和文件可继承集的目的 39.3.6 在shell中给文件赋予能力和查看文件能力 39.4 现代能力实现 39.5 在exec中转变进程能力 39.5.1 能力边界集 39.5.2 保持root语义 39.6 改变用户ID对进程能力的影响 39.7 用编程的方式改变进程能力 39.8 创建仅包含能力的环境 39.9 发现程序所需的能力 39.10 不具备文件能力的老式内核和系统 39.11 总结 39.12 习题 第40章 登录记账 40.1 utmp和wtmp文件概述 40.2 utmpx API 40.3 utmpx结构 40.4 从utmp和wtmp文件中检索信息 40.5 获取登录名称:getlogin 40.6 为登录会话更新utmp和wtmp文件 40.7 lastlog文件 40.8 总结 40.9 习题 第41章 共享库基础 41.1 目标库 41.2 静态库 41.3 共享库概述 41.4 创建和使用共享库–首回合 41.4.1 创建一个共享库 41.4.2 位置独立的代码 41.4.3 使用一个共享库 41.4.4 共享库soname 41.5 使用共享库的有用工具 41.6 共享库版本和命名规则 41.7 安装共享库 41.8 兼容与不兼容库比较 41.9 升级共享库 41.10 在目标文件中指定库搜索目录 41.11 在运行时找出共享库 41.12 运行时符号解析 41.13 使用静态库取代共享库 41.14 总结 41.15 习题 第42章 共享库高级特性 42.1 动态加载库 42.1.1 打开共享库:dlopen 42.1.2 错误诊断:dlerror 42.1.3 获取符号的地址:dlsym 42.1.4 关闭共享库:dlclose 42.1.5 获取与加载的符号相关的信息:dladdr 42.1.6 在主程序中访问符号 42.2 控制符号的可见性 42.3 链接器版本脚本 42.3.1 使用版本脚本控制符号的可见性 42.3.2 符号版本化 42.4 初始化和终止函数 42.5 预加载共享库 42.6 监控动态链接器:LD_DEBUG 42.7 总结 42.8 习题 第43章 进程间通信简介 43.1 IPC工具分类 43.2 通信工具 43.3 同步工具 43.4 IPC工具比较 43.5 总结 43.6 习题 第44章 管道和FIFO 44.1 概述 44.2 创建和使用管道 44.3 将管道作为一种进程同步的方法 44.4 使用管道连接过滤器 44.5 通过管道与Shell命令进行通信:popen 44.6 管道和stdio缓冲 44.7 FIFO 44.8 使用管道实现一个客户端/服务器应用程序 44.9 非阻塞I/O 44.10 管道和FIFO中read和write的语义 44.11 总结 44.12 习题 第45章 System V IPC介绍 45.1 概述 45.2 IPC Key 45.3 关联数据结构和对象权限 45.4 IPC标识符和客户端/服务器应用程序 45.5 System V IPC get调用使用的算法 45.6 ipcs和ipcrm命令 45.7 获取所有IPC对象列表 45.8 IPC限制 45.9 总结 45.10 习题 第46章 System V消息队列 46.1 创建或打开一个消息队列 46.2 交换消息 46.2.1 发送消息 46.2.2 接收消息 46.3 消息队列控制操作 46.4 消息队列关联数据结构 46.5 消息队列的限制 46.6 显示系统中所有消息队列 46.7 使用消息队列实现客户端/服务器应用程序 46.8 使用消息队列实现文件服务器应用程序 46.9 System V消息队列的缺点 46.10 总结 46.11 习题 第47章 System V信号量 47.1 概述 47.2 创建或打开一个信号量集 47.3 信号量控制操作 47.4 信号量关联数据结构 47.5 信号量初始化 47.6 信号量操作 47.7 多个阻塞信号量操作的处理 47.8 信号量撤销值 47.9 实现一个二元信号量协议 47.10 信号量限制 47.11 System V信号量的缺点 47.12 总结 47.13 习题 第48章 System V共享内存 48.1 概述 48.2 创建或打开一个共享内存段 48.3 使用共享内存 48.4 示例:通过共享内存传输数据 48.5 共享内存在虚拟内存中的位置 48.6 在共享内存中存储指针 48.7 共享内存控制操作 48.8 共享内存关联数据结构 48.9 共享内存的限制 48.10 总结 48.11 习题 第49章 内存映射 49.1 概述 49.2 创建一个映射:mmap 49.3 解除映射区域:munmap 49.4 文件映射 49.4.1 私有文件映射 49.4.2 共享文件映射 49.4.3 边界情况 49.4.4 内存保护和文件访问模式交互 49.5 同步映射区域:msync 49.6 其他mmap标记 49.7 匿名映射 49.8 重新映射一个映射区域:mremap 49.9 MAP_NORESERVE和过度利用交换空间 49.10 MAP_FIXED标记 49.11 非线性映射:remap_file_pages 49.12 总结 49.13 习题 第50章 虚拟内存操作 50.1 改变内存保护:mprotect 50.2 内存锁:mlock和mlockatt 50.3 确定内存驻留性:mincore 50.4 建议后续的内存使用模式:madvise 50.5 小结 50.6 习题 第51章 POSIX IPC介绍 51.1 API概述 51.2 System V IPC与POSIX IPC比较 51.3 总结 第52章 POSIX消息队列 52.1 概述 52.2 打开、关闭和断开链接消息队列 52.3 描述符和消息队列之间的关系 52.4 消息队列特性 52.5 交换消息 52.5.1 发送消息 52.5.2 接收消息 52.5.3 在发送和接收消息时设置超时时间 52.6 消息通知 52.6.1 通过信号接收通知 52.6.2 通过线程接收通知 52.7 Linux特有的特性 52.8 消息队列限制 52.9 POSIX和System V消息队列比较 52.10 总结 52.11 习题 第53章 POSIX信号量 53.1 概述 53.2 命名信号量 53.2.1 打开一个命名信号量 53.2.2 关闭一个信号量 53.2.3 删除一个命名信号量 53.3 信号量操作 53.3.1 等待一个信号量 53.3.2 发布一个信号量 53.3.3 获取信号量的当前值 53.4 未命名信号量 53.4.1 初始化一个未命名信号量 53.4.2 销毁一个未命名信号量 53.5 与其他同步技术比较 53.6 信号量的限制 53.7 总结 53.8 习题 第54章 POSIX共享内存 54.1 概述 54.2 创建共享内存对象 54.3 使用共享内存对象 54.4 删除共享内存对象 54.5 共享内存APIs比较 54.6 总结 54.7 习题 第55章 文件加锁 55.1 概述 55.2 使用flock给文件加锁 55.2.1 锁继承与释放的语义 55.2.2 flock的限制 55.3 使用fcntl给记录加锁 55.3.1 死锁 55.3.2 示例:一个交互式加锁程序 55.3.3 示例:一个加锁函数库 55.3.4 锁的限制和性能 55.3.5 锁继承和释放的语义 55.3.6 锁定饿死和排队加锁请求的优先级 55.4 强制加锁 55.5 /proc/locks文件 55.6 仅运行一个程序的单个实例 55.7 老式加锁技术 55.8 总结 55.9 习题 第56章 SOCKET:介绍 56.1 概述 56.2 创建一个socket:socket 56.3 将socket绑定到地址:bind 56.4 通用socket地址结构:struct sockaddr 56.5 流socket 56.5.1 监听接入连接:listen 56.5.2 接受连接:accept 56.5.3 连接到对等socket:connect 56.5.4 流socket I/O 56.5.5 连接终止:close 56.6 数据报socket 56.6.1 交换数据报:recvfrom和sendto 56.6.2 在数据报socket上使用connect 56.7 总结 第57章 SOCKET:UNIX DOMAIN 57.1 UNIX domain socket地址:struct sockaddr_un 57.2 UNIX domain中的流socket 57.3 UNIX domain中的数据报socket 57.4 UNIX domain socket权限 57.5 创建互联socket对:socketpair 57.6 Linux抽象socket名空间 57.7 总结 57.8 习题 第58章 SOCKET:TCP/IP网络基础 58.1 因特网 58.2 联网协议和层 58.3 数据链路层 58.4 网络层:IP 58.5 IP地址 58.6 传输层 58.6.1 端口号 58.6.2 用户数据报协议(UDP) 58.6.3 传输控制协议(TCP) 58.7 请求注解(RFC) 58.8 总结 第59章 SOCKET:Internet DOMAIN 59.1 Internet domain socket 59.2 网络字节序 59.3 数据表示 59.4 Internet socket地址 59.5 主机和服务转换函数概述 59.6 inet_pton和inet_ntop函数 59.7 客户端-服务器示例(数据报socket) 59.8 域名系统(DNS) 59.9 /etc/services文件 59.10 独立于协议的主机和服务转换 59.10.1 getaddrinfo函数 59.10.2 释放addrinfo列表:freeaddrinfo 59.10.3 错误诊断:gai_strerror 59.10.4 getnameinfo函数 59.11 客户端-服务器示例(流式socket) 59.12 Internet domain socket库 59.13 过时的主机和服务转换API 59.13.1 inet_aton和inet_ntoa函数 59.13.2 gethostbyname和gethostbyaddr函数 59.13.3 getserverbyname和getserverbyport函数 59.14 UNIX与Internet domain socket比较 59.15 更多信息 59.16 总结 59.17 习题 第60章 SOCKET:服务器设计 60.1 迭代型和并发型服务器 60.2 迭代型UDP echo服务器 60.3 并发型TCP echo服务器 60.4 并发型服务器的其他设计方案 60.5 inetd(Internet超级服务器)守护进程 60.6 总结 60.7 练习 第61章 SOCKET:高级主题 61.1 流式套接字上的部分读和部分写 61.2 shutdown系统调用 61.3 专用于套接字的I/O系统调用:recv和send 61.4 sendfile系统调用 61.5 获取套接字地址 61.6 深入探讨TCP协议 61.6.1 TCP报文的格式 61.6.2 TCP序列号和确认机制 61.6.3 TCP协议状态机以及状态迁移图 61.6.4 TCP连接的建立 61.6.5 TCP连接的终止 61.6.6 在TCP套接字上调用shutdown 61.6.7 TIME_WAIT状态 61.7 监视套接字:netstat 61.8 使用tcpdump来监视TCP流量 61.9 套接字选项 61.10 SO_REUSEADDR套接字选项 61.11 在accept中继承标记和选项 61.12 TCP vs UDP 61.13 高级功能 61.13.1 带外数据 61.13.2 sendmsg和recvmsg系统调用 61.13.3 传递文件描述符 61.13.4 接收发送端的凭据 61.13.5 顺序数据包套接字 61.13.6 SCTP以及DCCP传输层协议 61.14 总结 61.15 练习 第62章 终端 62.1 整体概览 62.2 获取和修改终端属性 62.3 stty命令 62.4 终端特殊字符 62.5 终端标志 62.6 终端的I/O模式 62.6.1 规范模式 62.6.2 非规范模式 62.6.3 加工模式、cbreak模式以及原始模式 62.7 终端线速(比特率) 62.8 终端的行控制 62.9 终端窗口大小 62.10 终端标识 62.11 总结 62.12 练习 第63章 其他备选的I/O模型 63.1 整体概览 63.1.1 水平触发和边缘触发 63.1.2 在备选的I/O模型中采用非阻塞I/O 63.2 I/O多路复用 63.2.1 select系统调用 63.2.2 poll系统调用 63.2.3 文件描述符何时就绪? 63.2.4 比较select和poll 63.2.5 select和poll存在的问题 63.3 信号驱动I/O 63.3.1 何时发送”I/O就绪”信号 63.3.2 优化信号驱动I/O的使用 63.4 epoll编程接口 63.4.1 创建epoll实例:epoll_create 63.4.2 修改epoll的兴趣列表:epoll_ctl 63.4.3 事件等待:epoll_wait 63.4.4 深入探究epoll的语义 63.4.5 epoll同I/O多路复用的性能对比 63.4.6 边缘触发通知 63.5 在信号和文件描述符上等待 63.5.1 pselect系统调用 63.5.2 self-pipe技巧 63.6 总结 63.7 练习 第64章 伪终端 64.1 整体概览 64.2 UNIX98伪终端 64.2.1 打开未使用的主设备:posix_openpt 64.2.2 修改从设备属主和权限:grantpt 64.2.3 解锁从设备:unlockpt 64.2.4 获取从设备名称:ptsname 64.3 打开主设备:ptyMasterOpen 64.4 将进程连接到伪终端:ptyFork 64.5 伪终端I/O 64.6 实现script(1)程序 64.7 终端属性和窗口大小 64.8 BSD风格的伪终端 64.9 总结 64.10 练习 附录A 跟踪系统调用 附录B 解析命令行选项 附录C 对NULL指针做转型 附录D 内核配置 附录E 更多信息源 附录F 部分习题解答

2018-02-15

Java核心技术(NEW)

《Java核心技术(原书第10版)》,机械工业出版社出版,外文书名: Core Java。作者:凯 S.霍斯特曼 (Cay S. Horstmann) (作者),‎ 周立新 (译者),‎ 陈波 (译者),‎ 叶乃文 (译者),‎ 杜永萍 (译者),‎ 等。《Java核心技术》是Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。第10版根据JavaSE8全方面更新,同时修正了第9版中的不足,系统全面地讲解了Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强。 作者简介 凯 S.霍斯特曼(Cay S.Horstmann),圣何塞州立大学计算机科学系教授、Java的倡导者,经常在开发人员会议上发表演讲。他是《Core Java for the Impatient》(2015)《Java SE 8 for the Really Impatient》(2014)和《Scala for the Impatient》(2012)的作者,这些书均由Addison—Wesley出版。他为专业程序员和计算机科学专业学生编写过数十本图书。 《Java核心技术(原书第10版)》图书目录 第1章Java程序设计概述1 1.1Java程序设计平台1 1.2Java“白皮书”的关键术语2 1.2.1简单性2 1.2.2面向对象2 1.2.3分布式3 1.2.4健壮性3 1.2.5安全性3 1.2.6体系结构中立4 1.2.7可移植性4 1.2.8解释型5 1.2.9高性能5 1.2.10多线程5 1.2.11动态性5 1.3Javaapplet与Internet6 1.4Java发展简史7 1.5关于Java的常见误解9 第2章Java程序设计环境12 2.1安装Java开发工具包12 2.1.1下载JDK12 2.1.2设置JDK13 2.1.3安装库源文件和文档15 2.2使用命令行工具16 2.3使用集成开发环境18 2.4运行图形化应用程序21 2.5构建并运行applet23 第3章Java的基本程序设计结构28 3.1一个简单的Java应用程序28 3.2注释31 3.3数据类型32 3.3.1整型32 3.3.2浮点类型33 3.3.3char类型34 3.3.4Unicode和char类型35 3.3.5boolean类型35 3.4变量36 3.4.1变量初始化37 3.4.2常量37 3.5运算符38 3.5.1数学函数与常量39 3.5.2数值类型之间的转换40 3.5.3强制类型转换41 3.5.4结合赋值和运算符42 3.5.5自增与自减运算符42 3.5.6关系和boolean运算符42 3.5.7位运算符43 3.5.8括号与运算符级别44 3.5.9枚举类型45 3.6字符串45 3.6.1子串45 3.6.2拼接46 3.6.3不可变字符串46 3.6.4检测字符串是否相等47 3.6.5空串与Null串48 3.6.6码点与代码单元49 3.6.7StringAPI50 3.6.8阅读联机API文档52 3.6.9构建字符串54 3.7输入输出55 3.7.1读取输入55 3.7.2格式化输出58 3.7.3文件输入与输出61 3.8控制流程63 3.8.1块作用域63 3.8.2条件语句63 3.8.3循环66 3.8.4确定循环69 3.8.5多重选择:switch语句72 3.8.6中断控制流程语句74 3.9大数值76 3.10数组78 3.10.1foreach循环79 3.10.2数组初始化以及匿名数组80 3.10.3数组拷贝81 3.10.4命令行参数81 3.10.5数组排序82 3.10.6多维数组85 3.10.7不规则数组88 第4章对象与类91 4.1面向对象程序设计概述91 4.1.1类92 4.1.2对象93 4.1.3识别类93 4.1.4类之间的关系94 4.2使用预定义类95 4.2.1对象与对象变量95 4.2.2Java类库中的LocalDate类98 4.2.3更改器方法与访问器方法100 4.3用户自定义类103 4.3.1Employee类103 4.3.2多个源文件的使用105 4.3.3剖析Employee类106 4.3.4从构造器开始106 4.3.5隐式参数与显式参数108 4.3.6封装的优点109 4.3.7基于类的访问权限111 4.3.8私有方法111 4.3.9f?inal实例域112 4.4静态域与静态方法112 4.4.1静态域112 4.4.2静态常量113 4.4.3静态方法114 4.4.4工厂方法115 4.4.5main方法115 4.5方法参数118 4.6对象构造123 4.6.1重载123 4.6.2默认域初始化123 4.6.3无参数的构造器124 4.6.4显式域初始化125 4.6.5参数名125 4.6.6调用另一个构造器126 4.6.7初始化块127 4.6.8对象析构与finalize方法130 4.7包131 4.7.1类的导入131 4.7.2静态导入133 4.7.3将类放入包中133 4.7.4包作用域136 4.8类路径137 4.8.1设置类路径139 4.9文档注释140 4.9.1注释的插入140 4.9.2类注释140 4.9.3方法注释141 4.9.4域注释142 4.9.5通用注释142 4.9.6包与概述注释143 4.9.7注释的抽取143 4.10类设计技巧144 第5章继承147 5.1类、超类和子类147 5.1.1定义子类147 5.1.2覆盖方法149 5.1.3子类构造器150 5.1.4继承层次153 5.1.5多态154 5.1.6理解方法调用155 5.1.7阻止继承:final类和方法157 5.1.8强制类型转换158 5.1.9抽象类160 5.1.10受保护访问165 5.2Object:所有类的超类166 5.2.1equals方法166 5.2.2相等测试与继承167 5.2.3hashCode方法170 5.2.4toString方法172 5.3泛型数组列表178 5.3.1访问数组列表元素180 5.3.2类型化与原始数组列表的兼容性183 5.4对象包装器与自动装箱184 5.5参数数量可变的方法187 5.6枚举类188 5.7反射190 5.7.1Class类190 5.7.2捕获异常192 5.7.3利用反射分析类的能力194 5.7.4在运行时使用反射分析对象198 5.7.5使用反射编写泛型数组代码202 5.7.6调用任意方法205 5.8继承的设计技巧208 第6章接口、lambda表达式与内部类211 6.1接口211 6.1.1接口概念211 6.1.2接口的特性217 6.1.3接口与抽象类218 6.1.4静态方法218 6.1.5默认方法219 6.1.6解决默认方法冲突220 6.2接口示例222 6.2.1接口与回调222 6.2.2Comparator接口224 6.2.3对象克隆225 6.3lambda表达式231 6.3.1为什么引入lambda表达式231 6.3.2lambda表达式的语法232 6.3.3函数式接口234 6.3.4方法引用235 6.3.5构造器引用237 6.3.6变量作用域237 6.3.7处理lambda表达式239 6.3.8再谈Comparator242 6.4内部类242 6.4.1使用内部类访问对象状态244 6.4.2内部类的特殊语法规则247 6.4.3内部类是否有用、必要和安全248 6.4.4局部内部类250 6.4.5由外部方法访问变量250 6.4.6匿名内部类252 6.4.7静态内部类255 6.5代理258 6.5.1何时使用代理259 6.5.2创建代理对象259 6.5.3代理类的特性262 第7章异常、断言和日志264 7.1处理错误264 7.1.1异常分类265 7.1.2声明受查异常267 7.1.3如何抛出异常269 7.1.4创建异常类270 7.2捕获异常271 7.2.1捕获异常271 7.2.2捕获多个异常273 7.2.3再次抛出异常与异常链274 7.2.4finally子句275 7.2.5带资源的try语句278 7.2.6分析堆栈轨迹元素280 7.3使用异常机制的技巧282 7.4使用断言285 7.4.1断言的概念285 7.4.2启用和禁用断言286 7.4.3使用断言完成参数检查287 7.4.4为文档假设使用断言288 7.5记录日志289 7.5.1基本日志289 7.5.2高级日志289 7.5.3修改日志管理器配置291 7.5.4本地化292 7.5.5处理器293 7.5.6过滤器296 7.5.7格式化器296 7.5.8日志记录说明296 7.6调试技巧304 第8章泛型程序设计309 8.1为什么要使用泛型程序设计309 8.1.1类型参数的好处309 8.1.2谁想成为泛型程序员310 8.2定义简单泛型类311 8.3泛型方法313 8.4类型变量的限定314 8.5泛型代码和虚拟机316 8.5.1类型擦除316 8.5.2翻译泛型表达式317 8.5.3翻译泛型方法318 8.5.4调用遗留代码319 8.6约束与局限性320 8.6.1不能用基本类型实例化类型参数320 8.6.2运行时类型查询只适用于原始类型321 8.6.3不能创建参数化类型的数组321 8.6.4Varargs警告322 8.6.5不能实例化类型变量323 8.6.6不能构造泛型数组323 8.6.7泛型类的静态上下文中类型变量无效325 8.6.8不能抛出或捕获泛型类的实例325 8.6.9可以消除对受查异常的检查326 8.6.10注意擦除后的冲突327 8.7泛型类型的继承规则328 8.8通配符类型330 8.8.1通配符概念330 8.8.2通配符的超类型限定331 8.8.3无限定通配符334 8.8.4通配符捕获334 8.9反射和泛型337 8.9.1泛型Class类337 8.9.2使用Class<T>参数进行类型匹配338 8.9.3虚拟机中的泛型类型信息338 …… 第9章集合344 第10章图形程序设计403 第11章事件处理439 第12章Swing用户界面组件469 第13章部署Java应用程序580 第14章并发624 附录AJava关键字710

2018-02-15

图文完全解析机器学习

《图解机器学习》图书目录 第I部分 绪 论 第1章 什么是机器学习 2 1.1 学习的种类  2 1.2 机器学习任务的例子  4 1.3 机器学习的方法  8 第2章 学习模型 12 2.1 线性模型  12 2.2 核模型  15 2.3 层级模型  17 第II部分 有监督回归 第3章 最小二乘学习法 22 3.1 最小二乘学习法  22 3.2 最小二乘解的性质  25 3.3 大规模数据的学习算法  27 第4章带有约束条件的最小二乘法 31 4.1 部分空间约束的最小二乘学习法  31 4.2 l2 约束的最小二乘学习法  33 4.3 模型选择  37 第5章 稀疏学习 43 5.1 l1 约束的最小二乘学习法  43 5.2 l1 约束的最小二乘学习的求解方法  45 5.3 通过稀疏学习进行特征选择  50 5.4 lp约束的最小二乘学习法  51 5.5 l1+l2 约束的最小二乘学习法  52 第6章 鲁棒学习 55 6.1 l1 损失最小化学习  56 6.2 Huber损失最小化学习  58 6.3 图基损失最小化学习  63 6.4 l1 约束的Huber损失最小化学习  65 第III部分 有监督分类 第7章 基于最小二乘法的分类 70 7.1 最小二乘分类  70 7.2 0/1 损失和间隔  73 7.3 多类别的情形  76 第8章 支持向量机分类 80 8.1 间隔最大化分类  80 8.2 支持向量机分类器的求解方法  83 8.3 稀疏性  86 8.4 使用核映射的非线性模型  88 8.5 使用Hinge损失最小化学习来解释  90 8.6 使用Ramp损失的鲁棒学习  93 第9章 集成分类 98 9.1 剪枝分类  98 9.2 Bagging学习法  101 9.3 Boosting 学习法  105 第10章 概率分类法 112 10.1 Logistic回归  112 10.2 最小二乘概率分类  116 第11 章序列数据的分类 121 11.1 序列数据的模型化  122 11.2 条件随机场模型的学习  125 11.3 利用条件随机场模型对标签序列进行预测  128 第IV部分 无监督学习 第12章 异常检测 132 12.1 局部异常因子  132 12.2 支持向量机异常检测  135 12.3 基于密度比的异常检测  137 第13章 无监督降维 143 13.1 线性降维的原理  144 13.2 主成分分析  146 13.3 局部保持投影  148 13.4 核函数主成分分析  152 13.5 拉普拉斯特征映射  155 第14章 聚类 158 14.1 K均值聚类  158 14.2 核K均值聚类  160 14.3 谱聚类  161 14.4 调整参数的自动选取  163 第V部分 新兴机器学习算法 第15章 在线学习 170 15.1 被动攻击学习  170 15.2 适应正则化学习  176 第16章 半监督学习 181 16.1 灵活应用输入数据的流形构造  182 16.2 拉普拉斯正则化最小二乘学习的求解方法  183 16.3 拉普拉斯正则化的解释  186 第17章 监督降维 188 17.1 与分类问题相对应的判别分析  188 17.2 充分降维  195 第18章 迁移学习 197 18.1 协变量移位下的迁移学习  197 18.2 类别平衡变化下的迁移学习  204 第19章 多任务学习 212 19.1 使用最小二乘回归的多任务学习  212 19.2 使用最小二乘概率分类器的多任务学习  215 19.3 多次维输出函数的学习  216 第VI部分 结 语 第20章 总结与展望 222 参考文献  225

2018-01-30

最易懂的Python 高清中文版

《可爱的Python》图书目录 实例故事 CDays“光盘故事” CDay-5 Python初体验和原始需求 CDay-4 可用的首个Python脚本 CDay-3 通过函式进行功能化 CDay-2 完成核心功能 CDay-1 实用化中文 CDay-0 时刻准备着!发布 CDay+1 优化!对白个儿的反省 CDay+2 界面!不应该是难事儿 CDay+3 优化!多线程 CDayN 基于Python的无尽探索 KDays “Web应用故事” KDay0 Web开发启航 KDay1 品尝Karrigell KDay2 通过表单直接完成功能 KDay3 使用第3方模块规范化表单 KDay4 使用KS模式重构代码 KDay5 通过session重构应用流程 KDay6 利用mill人性化组织成员信息 KDayN 经验总结,畅想Web应用 Python学习作弊条 环境篇 PCS0 如何安装Python PCS1 交互环境之命令行 PCS2 交互环境之iPython PCS3 交互环境之winpy PCS4 常用自省 PCS5 Python脚本文件 PCS6 Python与中文 PCS7 Python编码规范 语法篇 PCS100 import PCS101 内建数据类型 PCS102 For循环 PCS103 缩进 PCS104 注释 PCS105 对象 PCS106 文件对象 PCS107 字串格式化 PCS108 函式 PCS109 系统参数 PCS110 逻辑分支 PCS111 类 PCS112 异常 PCS113 交互参数 PCS114 FP初体验 模块篇 PCS200 os(stat;path) PCS201 cmd PCS202 chardet PCS203 epydoc PCS204 ConfigParser PCS205 内建函式(enumerate) PCS206 thread PCS207 threading PCS208 dict4ini PCS209 fnmatch PCS210 pickle PCS211 base64 PCS212 shutil PCS213 time PCS214 ElementTree PCS215 random PCS216 socket PCS217 Tkinter 框架篇 PCS300 CherryPy PCS301 Karrigell PC$302 Leo PCS303 MoinMoin PCS304 Python Web应用框架纵论 友邻篇 PCS400 GAE PCS401 DHTML PCS402 XML PCS403 思维导图 PCS404 代码重构浅说 附录引言 术语索引 行者箴言 Z跋

2018-01-30

流畅的Python

《流畅的Python》图书目录 第一部分 序幕 第1章 Python 数据模型 2 1.1 一摞 Python 风格的纸牌 3 1.2 如何使用特殊方法 6 1.2.1 模拟数值类型 7 1.2.2 字符串表示形式 9 1.2.3 算术运算符 10 1.2.4 自定义的布尔值 10 1.3 特殊方法一览 10 1.4 为什么 len 不是普通方法 12 1.5 本章小结 12 1.6 延伸阅读 13 第二部分 数据结构 第2章 序列构成的数组 16 2.1 内置序列类型概览 17 2.2 列表推导和生成器表达式 18 2.2.1 列表推导和可读性 18 2.2.2 列表推导同 filter 和 map 的比较 20 2.2.3 笛卡儿积 20 2.2.4 生成器表达式 21 2.3 元组不仅仅是不可变的列表 22 2.3.1 元组和记录 23 2.3.2 元组拆包 23 2.3.3 嵌套元组拆包 25 2.3.4 具名元组 26 2.3.5 作为不可变列表的元组 27 2.4 切片 28 2.4.1 为什么切片和区间会忽略最后一个元素 28 2.4.2 对对象进行切片 29 2.4.3 多维切片和省略 30 2.4.4 给切片赋值 31 2.5 对序列使用 + 和 * 31 2.6 序列的增量赋值 33 2.7 list.sort 方法和内置函数 sorted 36 2.8 用 bisect 来管理已排序的序列 37 2.8.1 用 bisect 来搜索 38 2.8.2 用 bisect.insort 插入新元素 40 2.9 当列表不是首选时 41 2.9.1 数组 41 2.9.2 内存视图 44 2.9.3 NumPy 和 SciPy 45 2.9.4 双向队列和其他形式的队列 47 2.10 本章小结 49 2.11 延伸阅读 50 第3章 字典和集合 54 3.1 泛映射类型 54 3.2 字典推导 56 3.3 常见的映射方法 57 3.4 映射的弹性键查询 61 3.4.1 defaultdict :处理找不到的键的一个选择 61 3.4.2 特殊方法 __missing__ 62 3.5 字典的变种 65 3.6 子类化 UserDict 65 3.7 不可变映射类型 67 3.8 集合论 68 3.8.1 集合字面量 69 3.8.2 集合推导 71 3.8.3 集合的操作 71 3.9 dict 和 set 的背后 73 3.9.1 一个关于效率的实验 74 3.9.2 字典中的散列表 75 3.9.3 dict 的实现及其导致的结果 78 3.9.4 set 的实现以及导致的结果 80 3.10 本章小结 80 3.11 延伸阅读 81 第4章 文本和字节序列 83 4.1 字符问题 84 4.2 字节概要 85 4.3 基本的编解码器 88 4.4 了解编解码问题 89 4.4.1 处理 UnicodeEncodeError 90 4.4.2 处理 UnicodeDecodeError 90 4.4.3 使用预期之外的编码加载模块时抛出的 SyntaxError 91 4.4.4 如何找出字节序列的编码 92 4.4.5 BOM:有用的鬼符 93 4.5 处理文本文件 94 4.6 为了正确比较而规范化 Unicode 字符串 99 4.6.1 大小写折叠 101 4.6.2 规范化文本匹配实用函数 102 4.6.3 极端“规范化”:去掉变音符号 103 4.7 Unicode 文本排序 105 4.8 Unicode 数据库 108 4.9 支持字符串和字节序列的双模式 API 109 4.9.1 正则表达式中的字符串和字节序列 109 4.9.2 os 函数中的字符串和字节序列 111 4.10 本章小结 112 4.11 延伸阅读 113 第三部分 把函数视作对象 第5章 一等函数 118 5.1 把函数视作对象 119 5.2 高阶函数 120 5.3 匿名函数 122 5.4 可调用对象 122 5.5 用户定义的可调用类型 123 5.6 函数内省 124 5.7 从定位参数到仅限关键字参数 126 5.8 获取关于参数的信息 127 5.9 函数注解 131 5.10 支持函数式编程的包 132 5.10.1 operator 模块 132 5.10.2 使用 functools.partial 冻结参数 135 5.11 本章小结 137 5.12 延伸阅读 137 第6章 使用一等函数实现设计模式 141 6.1 案例分析:重构“策略”模式 142 6.1.1 经典的“策略”模式 142 6.1.2 使用函数实现“策略”模式 145 6.1.3 选择最佳策略:简单的方式 148 6.1.4 找出模块中的全部策略 149 6.2 “命令”模式 150 6.3 本章小结 151 6.4 延伸阅读 152 第7章 函数装饰器和闭包 154 7.1 装饰器基础知识 155 7.2 Python 何时执行装饰器 156 7.3 使用装饰器改进“策略”模式 157 7.4 变量作用域规则 159 7.5 闭包 161 7.6 nonlocal 声明 164 7.7 实现一个简单的装饰器 165 7.8 标准库中的装饰器 168 7.8.1 使用 functools.lru_cache 做备忘 168 7.8.2 单分派泛函数 170 7.9 叠放装饰器 172 7.10 参数化装饰器 173 7.10.1 一个参数化的注册装饰器 173 7.10.2 参数化 clock 装饰器 175 7.11 本章小结 177 7.12 延伸阅读 178 第四部分 面向对象惯用法 第8章 对象引用、可变性和垃圾回收 182 8.1 变量不是盒子 183 8.2 标识、相等性和别名 184 8.2.1 在 == 和 is 之间选择 185 8.2.2 元组的相对不可变性 186 8.3 默认做浅复制 187 8.4 函数的参数作为引用时 190 8.4.1 不要使用可变类型作为参数的默认值 191 8.4.2 防御可变参数 193 8.5 del 和垃圾回收 195 8.6 弱引用 196 8.6.1 WeakValueDictionary 简介 197 8.6.2 弱引用的局限 199 8.7 Python 对不可变类型施加的把戏 199 8.8 本章小结 201 8.9 延伸阅读 201 第9章 符合 Python 风格的对象 205 9.1 对象表示形式 206 9.2 再谈向量类 206 9.3 备选构造方法 208 9.4 classmethod 与 staticmethod 209 9.5 格式化显示 210 9.6 可散列的 Vector2d 213 9.7 Python 的私有属性和“受保护的”属性 218 9.8 使用 __slots__ 类属性节省空间 220 9.9 覆盖类属性 222 9.10 本章小结 224 9.11 延伸阅读 225 第10章 序列的修改、散列和切片 229 10.1 Vector 类:用户定义的序列类型 230 10.2 Vector 类第1 版:与 Vector2d 类兼容 230 10.3 协议和鸭子类型 232 10.4 Vector 类第2 版:可切片的序列 233 10.4.1 切片原理 234 10.4.2 能处理切片的 __getitem__ 方法 236 10.5 Vector 类第3 版:动态存取属性 237 10.6 Vector 类第4 版:散列和快速等值测试 240 10.7 Vector 类第5 版:格式化 244 10.8 本章小结 251 10.9 延伸阅读 251 第11章 接口:从协议到抽象基类 256 11.1 Python 文化中的接口和协议 257 11.2 Python 喜欢序列 258 11.3 使用猴子补丁在运行时实现协议 260 11.4 Alex Martelli 的水禽 262 11.5 定义抽象基类的子类 266 11.6 标准库中的抽象基类 267 11.6.1 collections.abc 模块中的抽象基类 267 11.6.2 抽象基类的数字塔 269 11.7 定义并使用一个抽象基类 270 11.7.1 抽象基类句法详解 273 11.7.2 定义 Tombola 抽象基类的子类 274 11.7.3 Tombola 的虚拟子类 276 11.8 Tombola 子类的测试方法 278 11.9 Python 使用 register 的方式 281 11.10 鹅的行为有可能像鸭子 281 11.11 本章小结 283 11.12 延伸阅读 284 第12章 继承的优缺点 289 12.1 子类化内置类型很麻烦 289 12.2 多重继承和方法解析顺序 292 12.3 多重继承的真实应用 296 12.4 处理多重继承 298 12.5 一个现代示例:Django 通用视图中的混入 301 12.6 本章小结 304 12.7 延伸阅读 304 第13章 正确重载运算符 307 13.1 运算符重载基础 308 13.2 一元运算符 308 13.3 重载向量加法运算符 + 310 13.4 重载标量乘法运算符 * 315 13.5 众多比较运算符 318 13.6 增量赋值运算符 321 13.7 本章小结 325 13.8 延伸阅读 326 第五部分 控制流程 第14章 可迭代的对象、迭代器和生成器 330 14.1 Sentence 类第1 版:单词序列 331 14.2 可迭代的对象与迭代器的对比 334 14.3 Sentence 类第2 版:典型的迭代器 337 14.4 Sentence 类第3 版:生成器函数 339 14.5 Sentence 类第4 版:惰性实现 343 14.6 Sentence 类第5 版:生成器表达式 344 14.7 何时使用生成器表达式 345 14.8 另一个示例:等差数列生成器 346 14.9 标准库中的生成器函数 349 14.10 Python 3.3 中新出现的句法: yield from 357 14.11 可迭代的归约函数 358 14.12 深入分析 iter 函数 359 14.13 案例分析:在数据库转换工具中使用生成器 360 14.14 把生成器当成协程 362 14.15 本章小结 362 14.16 延伸阅读 363 第15章 上下文管理器和 else 块 368 15.1 先做这个,再做那个: if 语句之外的 else 块 369 15.2 上下文管理器和 with 块 370 15.3 contextlib 模块中的实用工具 374 15.4 使用 @contextmanager 375 15.5 本章小结 378 15.6 延伸阅读 378 第16章 协程 381 16.1 生成器如何进化成协程 382 16.2 用作协程的生成器的基本行为 382 16.3 示例:使用协程计算移动平均值 385 16.4 预激协程的装饰器 386 16.5 终止协程和异常处理 388 16.6 让协程返回值 391 16.7 使用 yield from 393 16.8 yield from 的意义 398 16.9 使用案例:使用协程做离散事件仿真 403 16.9.1 离散事件仿真简介 403 16.9.2 出租车队运营仿真 404 16.10 本章小结 410 16.11 延伸阅读 411 第17章 使用期物处理并发 416 17.1 示例:网络下载的三种风格 416 17.1.1 依序下载的脚本 418 17.1.2 使用 concurrent.futures 模块下载 420 17.1.3 期物在哪里 421 17.2 阻塞型 I/O 和 GIL 424 17.3 使用 concurrent.futures 模块启动进程 424 17.4 实验 Executor.map 方法 426 17.5 显示下载进度并处理错误 429 17.5.1 flags2 系列示例处理错误的方式 433 17.5.2 使用 futures.as_completed 函数 435 17.5.3 线程和多进程的替代方案 437 17.6 本章小结 437 17.7 延伸阅读 438 第18章 使用 asyncio 包处理并发 442 18.1 线程与协程对比 443 18.1.1 asyncio.Future :故意不阻塞 448 18.1.2 从期物、任务和协程中产出 449 18.2 使用 asyncio 和 aiohttp 包下载 450 18.3 避免阻塞型调用 454 18.4 改进 asyncio 下载脚本 456 18.4.1 使用 asyncio.as_completed 函数 456 18.4.2 使用 Executor 对象,防止阻塞事件循环 461 18.5 从回调到期物和协程 462 18.6 使用 asyncio 包编写服务器 466 18.6.1 使用 asyncio 包编写 TCP 服务器 467 18.6.2 使用 aiohttp 包编写 Web 服务器 471 18.6.3 更好地支持并发的智能客户端 474 18.7 本章小结 475 18.8 延伸阅读 476 第六部分 元编程 第19章 动态属性和特性 482 19.1 使用动态属性转换数据 483 19.1.1 使用动态属性访问 JSON 类数据 485 19.1.2 处理无效属性名 487 19.1.3 使用 __new__ 方法以灵活的方式创建对象 488 19.1.4 使用 shelve 模块调整 OSCON 数据源的结构 490 19.1.5 使用特性获取链接的记录 493 19.2 使用特性验证属性 498 19.2.1 LineItem 类第1 版:表示订单中商品的类 498 19.2.2 LineItem 类第2 版:能验证值的特性 499 19.3 特性全解析 500 19.3.1 特性会覆盖实例属性 501 19.3.2 特性的文档 503 19.4 定义一个特性工厂函数 504 19.5 处理属性删除操作 506 19.6 处理属性的重要属性和函数 507 19.6.1 影响属性处理方式的特殊属性 507 19.6.2 处理属性的内置函数 508 19.6.3 处理属性的特殊方法 509 19.7 本章小结 510 19.8 延伸阅读 510 第20章 属性描述符 514 20.1 描述符示例:验证属性 514 20.1.1 LineItem 类第3 版:一个简单的描述符 515 20.1.2 LineItem 类第4 版:自动获取储存属性的名称 519 20.1.3 LineItem 类第5 版:一种新型描述符 524 20.2 覆盖型与非覆盖型描述符对比 526 20.2.1 覆盖型描述符 528 20.2.2 没有 __get__ 方法的覆盖型描述符 529 20.2.3 非覆盖型描述符 530 20.2.4 在类中覆盖描述符 531 20.3 方法是描述符 531 20.4 描述符用法建议 533 20.5 描述符的文档字符串和覆盖删除操作 534 20.6 本章小结 535 20.7 延伸阅读 536 第21章 类元编程 538 21.1 类工厂函数 539 21.2 定制描述符的类装饰器 541 21.3 导入时和运行时比较 543 21.4 元类基础知识 547 21.5 定制描述符的元类 552 21.6 元类的特殊方法 __prepare__ 554 21.7 类作为对象 556 21.8 本章小结 557 21.9 延伸阅读 557 结语 560 附录 A 辅助脚本 563 Python 术语表 588 作者简介 600 关于封面 600

2018-01-30

最实用的Linux 命令行和shell脚本编程宝典

最实用的Linux 命令行和shell脚本编程宝典,是最常用的参考手册。

2018-01-24

Linux嵌入式学习文件两套

包含两套Linux学习文件,本人就是靠着这两本书入门的,认真看完可以入门Linux,完成小型项目的开发。

2018-01-24

名师韦东山嵌入式Linux应用开发最新完全手册

名师韦东山嵌入式Linux应用开发最新完全手册,最新版本。总共580页,非彩色,有点大。很全,很实用,内容涵盖全面,讲解透彻,举例很多。

2018-01-24

STM全系列芯片

STM全系列芯片,2018最新收集和校验。完全正确且可以使用。一个库搞定所有问题。原理图库和封装库,集成库

2018-01-09

AS1015典型稳定电路

AS1015典型稳定电路,可以实测,电阻部分不可更改,有原理图和PCB

2017-12-19

ALTIUM库文件

常用的altium库文件,自己经常使用感觉 挺好的,几乎所有常用的在里面都能找到,有元器件的原理图库和PCB库文件,现在分享给大家。

2017-12-19

插针式GPRS模块USR-GPRS232-7S3硬件开发库文件PCB

官网现在还没有插针式GPRS模块USR-GPRS232-7S3硬件开发库文件,现在在这里提供给大家。

2017-11-30

STM8各种型号都适用的PCB封装库

STM8各种型号都适用的PCB封装库,解压后直接在软件中选择对应的芯片,我感觉还挺好用的

2017-11-19

(WIN10版本)Visual C++ 6.0

(WIN10版本)Visual C++ 6.0,修改过后的版本,可以在WIN10上运行。安装时需要关闭安全软件,否则影响注册,可以放心,没有病毒

2017-11-19

socket C语言编写 客户端和服务器端程序

socket C语言编写 客户端和服务器端程序,用于服务器和客户端之间的通信

2017-11-19

4种常用进制转换器

V5.0.0.3版本好用,直接输入实时转换,我觉得很好用,现在分享给大家

2017-11-19

16进制和ASCII码校验码计算工具

16进制和ASCII码校验码计算工具,直接输入和计算,包含所有模式,可在软件界面下方选择

2017-11-19

网络调试助手

这个版本的网络调试助手稳定好用,可以直接设置IP地址和端口,有UDP和TCP协议

2017-11-19

STC12C5A60S2LQFP44封装完整的原理图以及PCB封装。

STC12C5A60S2LQFP44封装完整的原理图以及PCB封装。

2016-07-15

超级ALTIUM 库

超级ALTIUM 库

2016-07-14

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除