UnixLinux系统编程计算机科学丛书黑皮书操作系统嵌入式数据库数据挖掘人工pdf下载pdf下载

UnixLinux系统编程计算机科学丛书黑皮书操作系统嵌入式数据库数据挖掘人工百度网盘pdf下载

作者:
简介:本篇主要提供UnixLinux系统编程计算机科学丛书黑皮书操作系统嵌入式数据库数据挖掘人工pdf下载
出版社:静默时光图书专营店
出版时间:
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍


 
 书   名: unix/linux系统编程
 图书定价: 139元
 作 者: [美] K. C. 王(K. C. Wang)
 出 版 社: 机械工业出版社
 出版日期: 2020-06-09
 ISBN 号: 9787111656715
 开   本:16开
 页   数:386
 版   次:1-1
我在联想集团工作期间参与了多款掌上电脑、智能手机产品的研发,在其中承担操作系统移植和定制、设备驱动开发、产测工具开发等工作。当移动智能终端的主流操作平台向Android切换时,我次接触到Linux操作系统及其编程。当时感觉需要学习的知识非常多,GCC、GDB、makefile、系统调用、C库、shell命令、shell脚本、文件I/O、字符设备、块设备、套接字等各种名词扑面而来,让人手足无措。在这种情况下,我非常渴望有一本专著能够系统、深入地介绍Linux系统编程的知识,能够帮助我和我的团队迅速掌握基本原理和开发技能。遗憾的是,直到我离开联想集团都没有找到这样一本书。
在电子科技大学任教以后,我先后承担了“Linux操作系统编程”“嵌入式系统导论”以及“操作系统基础”等本科课程的教学工作。在教学过程中发现当前操作系统类课程的教材大多侧重于讲解经典的理论,并没有和实际的操作系统关联起来,甚至部分理论在当前的操作系统设计中根本没有实际的应用。另外,操作系统课程和操作系统编程课程的独立开设也让学生很难将操作系统的设计理念、实现机制与程序开发联系起来。为此,电子科技大学信息与软件工程学院启动了核心课程平台建设,尝试将“操作系统基础”与“Linux操作系统编程”课程融合,希望以Linux系统为蓝本,让学生能够理解内核的实际代码设计中蕴含的操作系统理论,通过编程项目进一步要求学生熟练掌握程序接口,帮助他们领会操作系统的工作机制和设计艺术。而要想达到理想的教学效果,就需要有Linux系统编程方面的教材或参考书。
感谢华章公司的刘锋先生让我拜读了K. C. Wang的这本Systems Programming in Unix/Linux,本书完美地契合了我心中对于工程与教学两个方面的需求,因此决定将本书翻译出来,希望能够让更多国内计算机相关的学生和从事Linux开发工作的工程师看到。在这里我要感谢我的妻子和父母,正是他们的默默付出才让我顺利完成了翻译工作。我还要感谢为本书编辑、校对付出辛勤努力的编辑。本书成稿之际正值新冠肺炎疫情肆虐之时,在这里祝福世界各国人民能够免受病毒的困扰,早日恢复生产、生活秩序。
由于Unix/Linux系统编程涉及的知识较多,加之译者的能力和水平有限,错误、疏漏及不足之处在所难免,敬请广大读者批评指正。
肖 堃
2020年3月于成都
Unix/Linux系统编程提供了广泛的计算机系统软件知识和编程技能,使读者能够与操作系统内核交互,有效利用系统资源,开发应用软件。它还为读者提供了从事计算机科学/工程研究(如操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算)所需的背景知识。

出版者的话
译者序
前言
第1章 引言1
1.1 关于本书1
1.2 系统编程的作用1
1.3 本书的目标1
1.3.1 强化学生的编程背景知识1
1.3.2 动态数据结构的应用2
1.3.3 进程概念和进程管理2
1.3.4 并发编程2
1.3.5 定时器和定时功能3
1.3.6 信号、信号处理和进程间通信3
1.3.7 文件系统3
1.3.8 TCP/IP和网络编程3
1.4 目标读者3
1.5 本书的独特之处4
1.6 将本书用作系统编程课程的教材5
1.7 其他参考书6
1.8 关于Unix6
1.8.1 AT&T Unix6
1.8.2 Berkeley Unix6
1.8.3 HP Unix7
1.8.4 IBM Unix7
1.8.5 Sun Unix7
1.9 关于Linux7
1.10 Linux版本7
1.10.1 Debian Linux8
1.10.2 Ubuntu Linux8
1.10.3 Linux Mint8
1.10.4 基于RPM的Linux8
1.10.5 Slackware Linux8
1.11 Linux硬件平台8
1.12 虚拟机上的Linux 8
1.12.1 VirtualBox9
1.12.2 VMware10
1.12.3 双启动Slackware和Ubuntu Linux11
1.13 使用Linux12
1.13.1 Linux内核映像12
1.13.2 Linux启动程序13
1.13.3 Linux启动13
1.13.4 Linux运行级别13
1.13.5 登录进程13
1.13.6 命令执行13
1.14 使用Ubuntu Linux14
1.14.1 Ubuntu版本14
1.14.2 Ubuntu Linux的特性14
1.15 Unix/Linux文件系统组织15
1.15.1 文件类型15
1.15.2 文件路径名15
1.15.3 Unix/Linux命令16
1.15.4 Linux手册页16
1.16 Ubuntu Linux系统管理17
1.16.1 用户账户17
1.16.2 添加新用户17
1.16.3 sudo命令17
参考文献18
第2章 编程背景19
2.1 Linux中的文本编辑器19
2.1.1 vim19
2.1.2 gedit20
2.1.3 emacs20
2.2 使用文本编辑器20
2.2.1 使用emacs21
2.2.2 emacs菜单21
2.2.3 emacs的集成开发环境22
2.3 程序开发22
2.3.1 程序开发步骤22
2.3.2 静态与动态链接24
2.3.3 可执行文件格式25
2.3.4 a.out文件的内容25
2.3.5 程序执行过程26
2.3.6 程序终止27
2.4 C语言中的函数调用27
2.4.1 32位GCC中的运行时堆栈使用情况27
2.4.2 long jump30
2.4.3 64位GCC中的运行时堆栈使用情况32
2.5 C语言程序与汇编代码的链接34
2.5.1 用汇编代码编程34
2.5.2 用汇编语言实现函数36
2.5.3 从汇编中调用C函数38
2.6 链接库38
2.6.1 静态链接库38
2.6.2 动态链接库39
2.7 makefile39
2.7.1 makefile格式39
2.7.2 make程序40
2.7.3 makefile示例40
2.8 GDB调试工具45
2.8.1 在emacs IDE中使用GDB45
2.8.2 有关使用调试工具的建议49
2.8.3 C语言程序中的常见错误49
2.9 C语言结构体53
2.9.1 结构体和指针54
2.9.2 C语言类型转换55
2.10 链表处理56
2.10.1 链表56
2.10.2 链表操作57
2.10.3 构建链表57
2.10.4 链表遍历60
2.10.5 搜索链表61
2.10.6 插入操作62
2.10.7 优先级队列63
2.10.8 删除操作63
2.10.9 循环链表64
2.10.10 可扩充C语言结构体64
2.10.11 双向链表65
2.10.12 双向链表示例程序65
2.11 树73
2.12 二叉树73
2.12.1 二叉搜索树73
2.12.2 构建二叉搜索树74
2.12.3 二叉树遍历算法75
2.12.4 深度优先遍历算法75
2.12.5 广度优先遍历算法75
2.13 编程项目:Unix/Linux文件系统树模拟器77
2.13.1 Unix/Linux文件系统树77
2.13.2 用二叉树实现普通树77
2.13.3 项目规范及要求78
2.13.4 命令规范78
2.13.5 程序结构体78
2.13.6 命令算法81
2.13.7 示例解决方案83
2.14 习题84
参考文献86
第3章 Unix/Linu程管理87
3.1 多任务处理87
3.2 进程的概念87
3.3 多任务处理系统88
3.3.1 type.h 文件88
3.3.2 ts.s文件89
3.3.3 queue.c 文件89
3.3.4 t.c文件90
3.3.5 多任务处理系统代码介绍93
3.4 进程同步95
3.4.1 睡眠模式95
3.4.2 唤醒操作96
3.5 进程终止96
3.5.1 kexit()的算法97
3.5.2 进程家族树97
3.5.3 等待子进程终止98
3.6 MT系统中的进程管理99
3.7 Unix/Linux中的进程100
3.7.1 进程来源100
3.7.2 INIT和守护进程100
3.7.3 登录进程100
3.7.4 sh进程101
3.7.5 进程的执行模式101
3.8 进程管理的系统调用102
3.8.1 fork()102
3.8.2 进程执行顺序103
3.8.3 进程终止104
3.8.4 等待子进程终止105
3.8.5 Linux中的subreaper进程106
3.8.6 exec():更改进程执行映像108
3.8.7 环境变量108
3.9 I/O重定向111
3.9.1 文件流和文件描述符111
3.9.2 文件流I/O和系统调用111
3.9.3 重定向标准输入111
3.9.4 重定向标准输出112
3.10 管道112
3.10.1 Unix/Linux中的管道编程113
3.10.2 管道命令处理115
3.10.3 将管道写进程与管道读进程连接起来115
3.10.4 命名管道116
3.11 编程项目:sh模拟器117
3.11.1 带有I/O重定向的单命令117
3.11.2 带有管道的命令118
3.11.3 ELF可执行文件与sh脚本文件118
3.11.4 示例解决方案119
3.12 习题119
参考文献120
第4章 并发编程121
4.1 并行计算导论121
4.1.1 顺序算法与并行算法121
4.1.2 并行性与并发性122
4.2 线程122
4.2.1 线程的原理122
4.2.2 线程的优点122
4.2.3 线程的缺点123
4.3 线程操作123
4.4 线程管理函数123
4.4.1 创建线程124
4.4.2 线程ID125
4.4.3 线程终止125
4.4.4 线程连接125
4.5 线程示例程序125
4.5.1 用线程计算矩阵的和125
4.5.2 用线程快速排序127
4.6 线程同步129
4.6.1 互斥量129
4.6.2 死锁预防131
4.6.3 条件变量132
4.6.4 生产者-消费者问题133
4.6.5 信号量136
4.6.6 屏障137
4.6.7 用并发线程解线性方程组138
4.6.8 Linux中的线程140
4.7 编程项目:用户级线程141
4.7.1 项目基本代码:一个多任务处理系统142
4.7.2 用户级线程145
4.7.3 线程连接操作的实现147
4.7.4 互斥量操作的实现151
4.7.5 用并发程序测试有互斥量的项目152
4.7.6 信号量的实现156
4.7.7 使用信号量实现生产者-消费者问题156
4.8 习题158
参考文献159
第5章 定时器及时钟服务160
5.1 硬件定时器160
5.2 个人计算机定时器160
5.3 CPU操作161
5.4 中断处理161
5.5 时钟服务函数161
5.5.1 gettimeofday-settimeofday162
5.5.2 time系统调用163
5.5.3 times系统调用164
5.5.4 time和date命令164
5.6 间隔定时器164
5.7 REAL模式间隔定时器166
5.8 编程项目166
5.8.1 系统基本代码167
5.8.2 定时器中断170
5.8.3 定时器队列171
5.8.4 临界区173
5.8.5主题173
5.9 习题174
参考文献174
第6章 信号和信号处理175
6.1 信号和中断175
6.2 Unix/Linux信号示例177
6.3 Unix/Linux中的信号处理177
6.3.1 信号类型177
6.3.2 信号的来源178
6.3.3 进程PROC结构体中的信号178
6.3.4 信号处理函数179
6.3.5 安装信号捕捉函数179
6.4 信号处理步骤181
6.5 信号与异常182
6.6 信号用作IPC182
6.7 Linux中的IPC183
6.7.1 管道和FIFO183
6.7.2 信号184
6.7.3 System V IPC184
6.7.4 POSIX消息队列184
6.7.5 线程同步机制184
6.7.6 套接字184
6.8 编程项目:实现一个消息IPC184
6.9 习题186
参考文献186
第7章 文件操作187
7.1 文件操作级别187
7.2 文件I/O操作189
7.3 低级别文件操作191
7.3.1 分区191
7.3.2 格式化分区193
7.3.3 挂载分区194
7.4 EXT2文件系统简介195
7.4.1 EXT2文件系统数据结构195
7.4.2级块196
7.4.3 块组描述符196
7.4.4 位图197
7.4.5 索引节点197
7.4.6 目录条目198
7.5 编程示例198
7.5.1 显示级块198
7.5.2 显示位图200
7.5.3 显示根索引节点202
7.5.4 显示目录条目203
7.6 编程项目:将文件路径名转换为索引节点205
7.7 习题206
参考文献206
第8章 使用系统调用进行文件操作207
8.1 系统调用207
8.2 系统调用手册页207
8.3 使用系统调用进行文件操作207
8.4 常用的系统调用209
8.5 链接文件210
8.5.1 硬链接文件210
8.5.2 符号链接文件211
8.6 stat系统调用211
8.6.1 stat文件状态211
8.6.2 stat结构体212
8.6.3 stat与文件索引节点213
8.6.4 文件类型和权限214
8.6.5 opendir-readdir函数215
8.6.6 readlink函数215
8.6.7 ls程序216
8.7 open-close-lseek系统调用217
8.7.1 打开文件和文件描述符218
8.7.2 关闭文件描述符218
8.7.3 lseek文件描述符218
8.8 read()系统调用218
8.9 write()系统调用219
8.10 文件操作示例程序219
8.10.1 显示文件内容219
8.10.2 复制文件220
8.10.3 选择性文件复制221
8.11 编程项目:使用系统调用递归复制文件222
8.11.1 提示和帮助222
8.11.2 示例解决方案223
参考文献223
第9章 I/O库函数224
9.1 I/O库函数224
9.2 I/O库函数与系统调用224
9.3 I/O库函数的算法227
9.3.1 fread算法227
9.3.2 fwrite算法227
9.3.3 fclose算法228
9.4 使用I/O库函数或系统调用228
9.5 I/O库模式228
9.5.1 字符模式I/O228
9.5.2 行模式I/O229
9.5.3 格式化I/O230
9.5.4 内存中的转换函数230
9.5.5 其他I/O库函数230
9.5.6 限制混合fread-fwrite230
9.6 文件流缓冲231
9.7 变参函数232
9.8 编程项目:类printf函数233
9.8.1 项目规范233
9.8.2 项目基本代码233
9.8.3 myprintf()的算法234
9.8.4 项目改进234
9.8.5 项目演示和示例解决方案234
9.9 习题234
参考文献235
第10章 sh编程236
10.1 sh脚本236
10.2 sh脚本与C程序236
10.3 命令行参数237
10.4 sh变量237
10.5 sh中的引号238
10.6 sh语句238
10.7 sh命令238
10.7.1 内置命令238
10.7.2 Linux命令239
10.8 命令替换240
10.9 sh控制语句240
10.9.1 if-else-fi语句240
10.9.2 for语句242
10.9.3 while语句242
10.9.4 until-do语句243
10.9.5 case语句243
10.9.6 continue和break语句243
10.10 I/O重定向243
10.11 嵌入文档243
10.12 sh函数244
10.13 sh中的通配符245
10.14 命令分组245
10.15 eval语句245
10.16 调试sh脚本246
10.17 sh脚本的应用246
10.18 编程项目:用sh脚本递归复制文件248
参考文献249
第11章 EXT2文件系统250
11.1 EXT2文件系统250
11.2 EXT2文件系统数据结构250
11.2.1 通过mkfs创建虚拟磁盘250
11.2.2 虚拟磁盘布局251
11.2.3级块251
11.2.4 块组描述符252
11.2.5 块和索引节点位图252
11.2.6 索引节点252
11.2.7 数据块253
11.2.8 目录条目254
11.3 邮差算法254
11.3.1 C语言中的Test-Set-Clear位254
11.3.2 将索引节点号转换为磁盘上的索引节点255
11.4 编程示例255
11.4.1 显示级块255
11.4.2 显示位图257
11.4.3 显示根索引节点259
11.4.4 显示目录条目260
11.5 遍历EXT2文件系统树261
11.5.1 遍历算法262
11.5.2 将路径名转换为索引节点263
11.5.3 显示索引节点磁盘块263
11.6 EXT2文件系统的实现263
11.6.1 文件系统的结构263
11.6.2 文件系统的级别264
11.7 基本文件系统265
11.7.1 type.h文件265
11.7.2 global.c文件267
11.7.3 实用程序函数268
11.7.4 mount-root272
11.7.5 基本文件系统的实现275
11.8 1级文件系统函数276
11.8.1 mkdir算法276
11.8.2 creat算法279
11.8.3 mkdir-creat的实现280
11.8.4 rmdir算法281
11.8.5 rmdir的实现283
11.8.6 link算法283
11.8.7 unlink算法285
11.8.8 symlink算法285
11.8.9 readlink算法286
11.8.10 其他1级函数286
11.8.11 编程项目1:1级文件系统的实现286
11.9 2级文件系统函数286
11.9.1 open算法287
11.9.2 lseek287
11.9.3 close算法288
11.9.4 读取普通文件288
11.9.5 写普通文件290
11.9.6 opendir-readdir291
11.9.7 编程项目2:2级文件系统的实现292
11.10 3级文件系统292
11.10.1 挂载算法292
11.10.2 卸载算法293
11.10.3 交叉挂载点293
11.10.4 文件保护294
11.10.5 实际uid和有效uid294
11.10.6 文件锁定294
11.10.7 编程项目3:整个文件系统的实现295
11.11 文件系统项目的扩展295
11.12 习题295
参考文献296
第12章 块设备I/O和缓冲区管理297
12.1 块设备I/O缓冲区297
12.2 Unix I/O缓冲区管理算法299
12.3 新的I/O缓冲区管理算法301
12.4 PV算法302
12.5 编程项目:I/O缓冲区管理算法比较303
12.5.1 系统组织303
12.5.2 多任务处理系统304
12.5.3 缓冲区管理器305
12.5.4 磁盘驱动程序305
12.5.5 磁盘控制器306
12.5.6 磁盘中断306
12.5.7 虚拟磁盘306
12.5.8 项目要求306
12.5.9 基本代码示例307
12.5.10 示例解决方案311
12.6 模拟系统的改进312
12.7 PV算法的改进312
参考文献313
第13章 TCP/IP和网络编程314
13.1 网络编程简介314
13.2 TCP/IP协议314
13.3 IP主机和IP地址315
13.4 IP协议315
13.5 IP数据包格式316
13.6 路由器316
13.7 UDP316
13.8 TCP316
13.9 端口编号316
13.10 网络和主机字节序317
13.11 TCP/IP网络中的数据流317
13.12 网络编程318
13.12.1 网络编程平台318
13.12.2 服务器-客户机计算模型318
13.13 套接字编程319
13.13.1 套接字地址319
13.13.2 套接字API319
13.14 UDP回显服务器-客户机程序321
13.15 TCP回显服务器-客户机程序323
13.16 主机名和IP地址326
13.17 TCP编程项目:互联网上的文件服务器328
13.17.1 项目规范328
13.17.2 帮助和提示329
13.17.3 多线程TCP服务器330
13.18 Web和CGI编程330
13.18.1 HTTP编程模型331
13.18.2 Web页面331
13.18.3 托管Web页面333
13.18.4 为Web页面配置HTTPD333
13.18.5 动态Web页面334
13.18.6 PHP334
13.18.7 CGI编程339
13.18.8 配置CGI的HTTPD339
13.19 CGI编程项目:通过CGI实现动态Web页面339
13.20 习题343
参考文献343
第14章 MySQL数据库系统344
14.1 MySQL简介344
14.2 安装MySQL344
14.2.1 Ubuntu Linux344
14.2.2 Slackware Linux344
14.3 使用MySQL345
14.3.1 连接到MySQL服务器345
14.3.2 显示数据库346
14.3.3 新建数据库346
14.3.4 删除数据库346
14.3.5 选择数据库347
14.3.6 创建表347
14.3.7 删除表348
14.3.8 MySQL中的数据类型348
14.3.9 插入行349
14.3.10 删除行350
14.3.11 更新表350
14.3.12 修改表351
14.3.13 关联表352
14.3.14 连接操作355
14.3.15 MySQL数据库关系图357
14.3.16 MySQL脚本357
14.4 C语言MySQL编程360
14.4.1 使用C语言构建MySQL客户机程序361
14.4.2 使用C语言连接到MySQL服务器361
14.4.3 使用C语言构建MySQL数据库362
14.4.4 使用C语言检索MySQL查询结果364
14.5 PHP MySQL编程367
14.5.1 使用PHP连接到MySQL服务器367
14.5.2 使用PHP创建数据库表368
14.5.3 使用PHP将记录插入表中369
14.5.4 在PHP中检索MySQL查询结果371
14.5.5 使用PHP进行更新操作372
14.5.6 使用PHP删除行373
14.6 习题373
参考文献373
通过详细的步骤讲解,帮助学生掌握系统编程所需的背景知识和技能

系统编程是计算机科学和计算机工程教育中不可或缺的一部分。计算机科学/工程课程中的系统编程课程起着两个重要作用。首先,它为学生提供了有关计算机系统软件和编程技能的广泛知识,使他们能够与操作系统内核进行交互,执行文件操作和网络编程,并有效利用系统资源来开发应用程序。其次,它为准备学习计算机科学/工程课程的学生提供了背景知识,这些课程包括操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能、计算机网络以及分布式计算和并行计算。由于其重要性,Unix/Linux系统编程已成为计算机科学/工程教育中的热门主题,并且也是程序员自学的主题,因此该领域有大量书籍和在线文章。尽管如此,我仍然发现很难为我在华盛顿州立大学讲授的系统编程课程选择一本合适的教材或参考书。多年以来,我在课程中不得不使用自己的课堂笔记和编程作业。经过深思熟虑,我决定将这些材料整理成书。
本书是为讲授和学习系统编程的理论和实践而服务的。与大多数其他书籍不同,这本书更深入地介绍了系统编程主题,并强调了编程实践。书中引入了一系列编程项目,让学生运用所学知识和编程技能来开发实用的程序。本书的目标是作为面向技术的系统编程课程的教科书。因为本书包含带有完整源代码的详细示例程序,所以也适合程序员自学使用。
事实证明,本书的编写是另一项非常艰巨且耗时的工作。在准备书稿期间,我得到了许多人的帮助和鼓励,这是我的荣幸。我想借此机会感谢他们。在此,我要特别感谢Yan Zhang为本书的插图和校对所提供的帮助。
还要特别感谢Cindy一如既往的支持和启发,没有她就没有本书。重要的是,我要感谢家人的支持,他们接受我无时无刻不在忙碌的所有借口。
本书中编程项目的示例解决方案可从http://wang.eecs.wsu.edu/~kcw下载。如需获取源代码,请通过电子邮件(kwang@eecs.wsu.edu)与作者联系。
K. C. Wang
美国华盛顿州普尔曼市
2018年4月



^_^:5637f842a02ac077d6d1d88ab488d15d