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章 引言1
1.1 关于本书1
1.2 系统编程的作用1
1.3 本书的目标1
1.3.1 强化学生的编程背景知识1
1.3.2 动态数据结构的应用2
1.3.3 进程概念和进程管理2
查看完整
目 录内容简介
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/Linux进程管理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.
^ 收 起
译者序
前言
第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/Linux进程管理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.
^ 收 起
目 录内容简介
Unix/Linux系统编程提供了广泛的计算机系统软件知识和高级编程技能,使读者能够与操作系统内核交互,有效利用系统资源,开发应用软件。它还为读者提供了从事计算机科学/工程高级研究(如操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算)所需的背景知识。
比价列表
1人想要
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠