GNU/Linux编程指南:入门·应用·精通

副标题:无

作   者:(美)Kurt Wall等著;张辉译

分类号:

ISBN:9787302055501

微信扫一扫,移动浏览光盘

简介

本书全面而深入地介绍了GNU/Linux编程。首先介绍了在Linux上编程必备的编程工具。然后在库函数、系统调用以及核上阐述Linux编程知识,并专门讲述了包括TCP/IP、UDP以及多播套拉口在内的网络编程知识;图形界面也是本书的重点内容,本书着重讲述了文本形式的图形界面库ncurses;还分别讲解了真正图形化的流行系统XWindows、Qt、GNOME以及OpenGL的基本编程方法;最后,介绍了Bash编程和设备驱动编程。本书包含大量实用实例,读者可以通过实例代码深入理解编程思想和技巧。本书另一优点是讲述了其他编程书籍通常没有提及的RPM包管理工具、文档编写以及发布许可证选择等内容,这是任何准备投身于GNU开发工作的程序员所必须具备的知识。本书对于所有Linux编程人员——无论是初学者还是高级用户——都是一本不可多得的参考资料。

目录

第1章 linux及linux编程综述 1

1.1 linux变得成熟了 1

1.1.1 linux的昨天 1

1.1.2 linux的今天 3

1.1.3 linux的明天 3

1.2 为何选择linux编程 3

1.3 每章内容介绍 5

1.3.1 linux编程工具包 5

1.3.2 输入、输出、文件和目录 5

1.3.3 进程和同步 6

1.3.4 网络编程 6

1.3.5 用户界面编程 7

1.3.6 特殊编程技术 8

1.3.7 补充内容 8

1.4 小结 8

第2章 设置开发系统 9

2.1 一般性考虑 9

2.2 主板和cpu 10

2.2.1 板上i/o 12

2.2.2 处理器 12

.2.2.3 bios 13

2.2.4 内存 13

2.2.5 机箱和电源 13

2.3 用户交互硬件:视频、声音、键盘及鼠标 14

2.3.1 显卡 14

2.3.2 显示器 15

2.3.3 声卡 16

2.3.4 键盘及鼠标 16

2.4 通信设备、端口及总线 17

2.4.1 调制解调器 17

2.4.2 网络接口卡 18

2.4.3 scsi 18

2.4.4 usb和火线(ieee1394) 18

2.4.5 串行卡 18

2.4.6 irda 19

2.4.7 pcmcia卡 19

2.4.8 isa即插即用设备 19

2.5 存储设备 19

2.5.1 硬盘 20

2.5.2 可移动磁盘设备 20

2.5.3 cd-rom/dvd 20

2.5.4 磁带备份设备 20

2.6 外围设备 21

2.6.1 打印机 21

2.6.2 扫描仪 21

2.6.3 数字相机 22

2.6.4 家居自动控制设备 22

2.7 完备型系统 22

2.8 便携系统 22

2.9 开发工具软件 23

2.9.1 关键库和头文件 23

2.9.2 调试器 23

2.9.3 编程工具 23

2.9.4 文本编辑器 24

2.10 小结 24

第3章 使用gnu cc 25

3.1 gnu cc特性 25

3.2 教学示例 26

3.3 常用命令行选项 29

3.3.1 函数库和包含文件 30

3.3.2 警告和出错消息选项 31

3.4 优化选项 36

3.5 调试选项 38

3.6 特定体系结构的选项 40

3.7 gnu c扩展 41

3.7.1 关于可移植性 41

3.7.2 gnu扩展 42

3.8 pgcc:奔腾处理器的编译器 45

3.9 小结 45

第4章 使用gnu make管理项目 46

4.1 为何使用make 46

4.2 编写makefile 46

4.3 编写makefile的规则 47

4.3.1 伪目标 49

4.3.2 变量 50

4.3.3 隐式规则 52

4.3.4 模式规则 53

4.3.5 注释 53

4.4 命令行选项和参数 53

4.5 调试make 54

4.6 常见的make出错信息 54

4.7 有用的makefile目标 54

4.8 小结 55

第5章 创建可移植的自配置软件 56

5.1 考虑可移植性 56

5.1.1 什么是程序的可移植性 56

5.1.2 移植性的线索和技巧 57

5.2 理解autoconf 58

5.2.1 创建configure.in 58

5.2.2 构造文件 58

5.2.3 有用的autoconf工具 59

5.3 内置宏 62

5.3.1 候选程序测试 62

5.3.2 库函数测试 63

5.3.3 头文件测试 64

5.3.4 结构测试 64

5.3.5 类型定义测试 64

5.3.6 编译器行为测试 65

5.3.7 系统服务测试 65

5.3.8 unix变体测试 66

5.4 普通宏 66

5.5 一个带注释的autoconf脚本 68

5.6 小结 74

第6章 比较和合并源代码文件 75

6.1 使用diff命令比较文件 75

6.2 理解diff3命令 83

6.3 准备源代码补丁 86

6.3.1 patch的命令行选项 86

6.3.2 创建补丁 87

6.3.3 应用补丁 88

6.4 小结 88

第7章 使用rcs和cvs控制版本 89

7.1 基本术语 89

7.2 使用修订控制系统(rcs) 90

7.2.1 rcs基本用法 90

7.2.2 找出rcs文件间的不同 95

7.2.3 其他rcs命令 98

7.3 使用并发版本系统(cvs) 100

7.3.1 同rcs相比的优点 100

7.3.2 设置cvs 100

7.3.3 检出源代码文件 102

7.3.4 将改动合并进源代码库 103

7.3.5 检查改动 103

7.3.6 添加和删除文件 104

7.3.7 解决文件冲突 105

7.3.8 cvs命令 106

7.3.9 cvs选项 106

7.4 小结 107

第8章 调试 108

8.1 为使用gdb进行编译 108

8.2 使用基本的gdb命令 109

8.2.1 启动gdb 109

8.2.2 在调试器中查看代码 111

8.2.3 检查数据 111

8.2.4 设置断点 113

8.2.5 检查并更改运行中的代码 114

8.3 高级gdb概念和命令 116

8.3.1 变量的作用域和上下文 116

8.3.2 遍历函数堆栈 117

8.3.3 操纵源代码文件 119

8.3.4 与shell进行通信 119

8.3.5 附加到某个运行中的程序 119

8.4 小结 121

第9章 出错处理 122

9.1 出错处理简述 122

9.2 出错处理选项 122

9.3 c语言机制 123

9.3.1 assert宏 123

9.3.2 使用预编译 125

9.3.3 标准库函数 127

9.4 使用系统日志 133

9.4.1 系统日志选项 134

9.4.2 系统日志函数 135

9.4.3 用户程序 138

9.5 小结 139

第10章 使用库 140

10.1 使用编程库 140

10.1.1 库兼容性 140

10.1.2 命名和编号约定 141

10.1.3 经常使用的库 142

10.2 库操作工具 143

10.2.1 理解nm命令 143

10.2.2 理解ar命令 144

10.2.3 理解ldd命令 144

10.2.4 理解ldconfig 145

10.2.5 环境变量和配置文件 145

10.3 编写并使用静态库 146

10.4 编写并使用共享库 151

10.5 使用动态加载的共享对象 152

10.5.1 理解dl接口 152

10.5.2 使用dl接口 154

10.6 小结 155

第2部分 输入、输出、文件和目录

第11章 输入和输出 156

11.1 基本特点和概念 156

11.2 理解文件描述符 160

11.2.1 文件描述符的概念 160

11.2.2 文件描述符的优缺点 161

11.3 使用文件描述符 162

11.3.1 打开关闭文件描述符 162

11.3.2 读写文件描述符 164

11.3.3 使用ftruncate缩短文件 166

11.3.4 使用lseek定位文件指针 166

11.3.5 使用fsync同步到硬盘 167

11.3.6 使用fstat获得文件信息 167

11.3.7 使用fchown改变文件所有权 172

11.3.8 使用fchmod改变文件读写权 172

11.3.9 使用flock和fcntl给文件上锁 172

11.3.10 使用dup和dup2调用 177

11.3.11 使用select同时读写多个文件 179

11.3.12 使用ioctl 182

11.4 小结 182

第12章 文件和目录操作 183

12.1 标准文件函数 183

12.1.1 打开和关闭文件 183

12.1.2 读写文件 184

12.1.3 获得文件状态 185

12.2 输入输出调用 186

12.2.1 格式化输出 186

12.2.2 格式化输入 187

12.2.3 字符输入输出 187

12.2.4 行输入输出 188

12.2.5 文件定位 189

12.2.6 缓冲区控制 189

12.2.7 删除和改名 189

12.2.8 使用临时文件 190

12.3 目录操作 191

12.3.1 找到当前目录 191

12.3.2 改变目录 191

12.3.3 创建和删除目录 191

12.3.4 获得目录列表 192

12.4 特殊的ext2文件系统属性 192

12.5 小结 195

第3部分 进程和同步

第13章 进程控制 196

13.1 linux进程模型 196

13.2 进程属性 196

13.2.1 进程标识号 197

13.2.2 real和effective标识号 198

13.2.3 setuid和setgid程序 198

13.2.4 用户和用户组信息 200

13.2.5 附加的进程信息 201

13.3 创建进程 208

13.3.1 使用system函数 208

13.3.2 fork系统调用 209

13.3.3 exec函数族 211

13.3.4 使用popen函数 213

13.4 控制进程 214

13.4.1 等待进程--wait函数族 214

13.4.2 杀死程序 216

13.5 信号 218

13.5.1 什么是信号 218

13.5.2 发送信号 219

13.5.3 捕获信号 221

13.5.4 检测信号 226

13.6 进程调度 227

13.7 小结 228

第14章 线程概述 229

14.1 什么是线程 229

14.2 __clone函数调用 229

14.3 pthread接口 230

14.3.1 pthread是什么 230

14.3.2 何时使用pthread 231

14.3.3 pthread_create函数 231

14.3.4 pthread_exit函数 231

14.3.5 pthread_ join函数 232

14.3.6 pthread_atfork函数 234

14.3.7 取消线程 234

14.3.8 pthread cleanup宏 237

14.3.9 pthread条件 238

14.3.10 pthread_equal函数 238

14.3.11 线程属性 239

14.3.12 互斥 240

14.4 小结 244

第15章 访问系统信息 245

15.1 进程信息 246

15.1.1 cmdline文件 246

15.1.2 environ文件 246

15.1.3 fd目录 247

15.1.4 mem文件 247

15.1.5 stat 247

15.1.6 status文件 249

15.1.7 cwd符号链接 249

15.1.8 exe符号链接 249

15.1.9 maps文件 249

15.1.10 root符号链接 249

15.1.11 statm文件 249

15.2 一般系统信息 249

15.2.1 /proc/cmdline文件 249

15.2.2 /proc/cpuinfo文件 250

15.2.3 /proc/devices文件 250

15.2.4 /proc/dma文件 250

15.2.5 /proc/file systems文件 250

15.2.6 /proc/interrupts文件 250

15.2.7 /proc/ioports文件 250

15.2.8 /proc/kcore文件 250

15.2.9 /proc/kmsg文件 250

15.2.10 /proc/ksyms文件 251

15.2.11 /proc/loadavg文件 251

15.2.12 /proc/locks文件 251

15.2.13 /proc/mdstat文件 251

15.2.14 /proc/meminfo文件 251

15.2.15 /proc/misc文件 251

15.2.16 /proc/modues文件 251

15.2.17 /proc/mounts文件 251

15.2.18 /proc/pci文件 251

15.2.19 /proc/rtc文件 252

15.2.20 /proc/stat文件 252

15.2.21 /proc/uptime文件 252

15.2.22 /proc/version文件 252

15.2.23 /proc/net子目录 252

15.2.24 /proc/scsi子目录 253

15.2.25 /proc/sys子目录 253

15.3 未来内核中/proc的变化 255

15.4 小结 255

第16章 内存管理 256

16.1 c内存管理回顾 256

16.1.1 malloc函数的使用 256

16.1.2 calloc函数的使用 257
16.1.3 realloc函数的使用 257

16.1.4 free函数的使用 257

16.1.5 alloca函数的使用 258

16.2 内存映像文件 258

16.2.1 mmap函数的使用 259

16.2.2 munmap函数的使用 260

16.2.3 msync函数的使用 260

16.2.4 mprotect函数的使用 260

16.2.5 锁定内存 261

16.2.6 mremap函数的使用 261

16.2.7 用内存映像实现cat命令 261

16.3 发现并修改内存问题 263

16.3.1 一个有问题的程序 263

16.3.2 electric fence 265

16.4 小结 267

第17章 进程间通信 268

17.1 管道 268

17.1.1 打开和关闭管道 269

17.1.2 读写管道 271

17.1.3 更简单的方法 274

17.2 fifo 276

17.2.1 理解fifo 276

17.2.2 创建fifo 278

17.2.3 打开和关闭fifo 279

17.2.4 读写fifo 279

17.3 system v ipc概述 282

17.3.1 system v ipc的主要概念 282

17.3.2 system v ipc的问题 284

17.3.3 linux和system v ipc 285

17.4 共享内存 285

17.4.1 创建共享内存区 286

17.4.2 附加共享内存区 288

17.5 消息队列 291

17.5.1 创建和打开消息队列 291

17.5.2 向队列中写入消息 293

17.5.3 读取队列中的消息 295

17.5.4 删除消息队列 297

17.6 信号灯 299

17.6.1 创建信号灯 299

17.6.2 控制和删除信号灯 301

17.7 小结 303

第18章 守护进程 304

18.1 理解守护进程 304

18.2 创建守护进程 304

18.2.1 函数调用 305

18.2.2 出错处理 308

18.3 和守护进程通信 311

18.3.1 读取配置文件 311

18.3.2 向守护进程加入信号处理功能 314

18.4 小结 319

第4部分 网络编程

第19章 tcp/ip和套接口编程 320

19.1 套接口的定义 320

19.2 通信域 321

19.3 套接口编程基础 321

19.3.1 分配套接口和初始化 321

19.3.2 完成连接的系统调用 323

19.3.3 传送数据 324

19.3.4 关闭 325

19.4 使用套接口的客户机/服务器例子程序 325

19.4.1 服务器的例子程序 326

19.4.2 客户机的例子程序 328

19.4.3 运行客户机和服务器的例子程序 331

19.4.4 使用web浏览器作为客户机运行服务器的例子程序 331

19.5 一个简单的web服务器和web客户机的例子程序 331

19.5.1 实现一个简单的web服务器 332

19.5.2 实现一个简单的web客户机 336

19.5.3 测试web服务器和web客户机 338

19.5.4 使用netscape navigator作为客户机运行简单的web服务器 339

19.6 通过其他编程语言使用套接口 339

19.7 unix域套接口的perl编程 339

19.8 监视套接口活动的工具 341

19.9 小结 342

第20章 udp:用户数据报协议 343

20.1 udp概述 343

20.1.1 udp和tcp的对比 343

20.1.2 tcp的优缺点 343

20.1.3 udp的优缺点 344

20.1.4 选择使用哪一种协议 344

20.2 实现一个基于udp的应用 345

20.2.1 使用udp发送数据 345

20.2.2 接收udp数据 348

20.2.3 最少的出错检查 350

20.2.4 非阻塞i/o 355

20.3 小结 361

第21章 多播套接口和非阻塞i/o 362

21.1 配置linux支持多播ip 362

21.2 为支持多播ip重新编译linux内核 363

21.3 多播ip广播的示例程序 363

21.3.1 使用多播ip广播数据 364

21.3.2 创建客户程序监听多播ip广播 366

21.3.3 运行多播ip示例程序 370

21.4 小结 371

第5部分 用户界面编程

第22章 底层终端控制 372

22.1 终端接口 372

22.2 控制终端 373

22.2.1 属性控制函数 374

22.2.2 速度控制函数 375

22.2.3 行控制函数 376

22.2.4 进程控制函数 377

22.3 使用终端接口 378

22.4 改变终端模式 380

22.5 使用terminfo 382

22.5.1 terminfo能力 382

22.5.2 terminfo编程 383

22.5.3 发挥terminfo能力 387

22.6 小结 390

第23章 ncurses入门 391

23.1 ncurses简史 391

23.2 使用ncurses编译程序 392

23.3 调试ncurses程序 392

23.4 关于窗口 392

23.4.1 ncurses窗口设计 393

23.4.2 ncurses函数命名规则 394

23.5 初始化和终止 395

23.5.1 ncurses初始化结构 395

23.5.2 ncurses终止 395

23.5.3 说明ncurses初始化和终止 396

23.6 输入和输出 398

23.6.1 输出例程 398

23.6.2 输入例程 406

23.7 色彩例程 409

23.8 窗口管理 411

23.9 其他各种工具函数 412

23.10 小结 415

第24章 ncurses高级编程 416

24.1 其他ncurses功能 416

24.1.1 鼠标支持 416

24.1.2 菜单支持 416

24.1.3 窗体支持 416

24.2 和鼠标交互 417

24.2.1 鼠标api概述 417

24.2.2 鼠标控制例程 418

24.2.3 示例程序 419

24.3 使用菜单 422

24.3.1 菜单api概述 422

24.3.2 菜单控制例程 423

24.3.3 示例程序 428

24.4 ncurses窗体 430

24.4.1 窗体api概述 430

24.4.2 窗体管理例程 431

24.4.3 示例程序 440

24.5 小结 441

第25章 x windows编程 442

25.1 x的概念 443

25.2 xlib api 444

25.2.1 xopendisplay 445

25.2.2 xcreatesimplewindow和xcreatewindow 445

25.2.3 映射窗口和撤销映射窗口 446

25.2.4 撤销窗口 447

25.2.5 事件处理 447

25.2.6 初始化图形设备上下文和字体 448

25.2.7 在x窗口中绘图 449

25.2.8 一个xlib的示例程序 449

25.3 x toolkit api 455

25.3.1 x toolkit使用入门 455

25.3.2 使用x工具包设置窗口部件参数 456

25.4 xfree86 458

25.4.1 dpms--显示器电源管理信令

25.4.2 dri--直接显示接口 458

25.4.3 dga--直接图形体系结构 458

25.4.4 xv--x视频 459

25.5 小结 459

第26章 athena、motif和lesstif窗口部件 460

26.1 使用athena的窗口部件 460

26.1.1 athena的标签窗口部件 460

26.1.2 athena的命令按钮窗口部件 461

26.1.3 athena的列表窗口部件 464

26.1.4 athena的文本窗口部件 465

26.1.5 athena的简单菜单窗口部件 468

26.2 使用motif的窗口部件 470

26.2.1 motif的标签窗口部件 471

26.2.2 motif的列表窗口部件 472

26.2.3 motif的文本窗口部件 474

26.3 编写一个定制的athena窗口部件 477

26.3.1 使用fetch_url.c文件 477

26.3.2 使用url.h文件 479

26.3.3 使用urlp.h文件 480

26.3.4 使用url.c文件 481

26.3.5 测试urlwidget 484

26.4 在c++程序中使用athena和motif 485

26.5 使用封装athena窗口部件的一个c++类库 486

26.5.1 component类 487

26.5.2 panewindow类 488

26.5.3 label类 490

26.5.4 button类 491

26.5.5 text类 492

26.6 小结 494

第27章 使用gtk+进行gui编程 495

27.1 gtk+简介 496

27.1.1 在gtk+中处理事件 497

27.1.2 使用gtk+的简短示例程序 498

27.1.3 各种gtk窗口部件 500

27.1.4 gtk容器窗口部件 501

27.2 一个用于显示xml文件的gtk+程序 502

27.2.1 xml简介 502

27.2.2 james clark的xml分析器expat 503

27.2.3 实现gtk+的xml显示程序 504

27.2.4 运行gtk+的xml显示程序 510

27.3 一个使用notebook窗口部件的gui程序 510

27.3.1 notebook窗口部件示例程序的实现 510

27.3.2 实现drawing窗口部件 512

27.3.3 运行gtk notebook窗口部件的示例程序 515

27.4 通过其他编程语言使用gtk+ 515

27.4.1 通过c++使用gtk+ 516

27.4.2 通过perl使用gtk+ 517

27.4.3 通过python使用gtk+ 518

27.5 gtk+的rad工具 518

27.6 小结 519

第28章 使用qt进行gui编程 520

28.1 通过重载qwidget类方法处理事件 521

28.1.1 qwidget类概述 521

28.1.2 实现drawwidget类 523

28.1.3 测试drawwidget 525

28.2 使用qt槽和信号处理事件 526

28.2.1 派生statelcdwidget类 526

28.2.2 使用信号和槽 529

28.2.3 运行信号/槽示例程序 531

28.3 用qt实现xmlview的程序 531

28.3.1 sax2:一个用于xml的简单api 532

28.3.2 dom:文档目标对象 533

28.4 小结 537

第29章 使用opengl和mesa进行3d图形编程 538

29.1 需要为本章准备什么 538

29.2 使用opengl 539

29.3 3d图形编程 539

29.3.1 orbits.c 539

29.3.2 为opengl图形创建窗口并初始化opengl 540

29.3.3 使用glut创建简单的3d对象 541

29.3.4 使用x-y-z坐标在3d空间中放置对象 542

29.3.5 沿着x-、y-、z-中任一坐标轴或所有坐标轴旋转对象 543

29.3.6 启用material属性 544

29.3.7 启用深度测试 545

29.3.8 处理键盘事件 545

29.3.9 为获得动画效果更新opengl图形 545

29.3.10 orbits程序清单 546

29.4 纹理映像 548

29.4.1 用纹理面产生立方体 548

29.4.2 创建纹理映像 549

29.4.3 立方体程序清单 550

29.5 小结 554

第6部分 特殊编程技术

第30章 使用gnu bash进行shell编程 555

30.1 为何使用bash 555

30.2 bash基础知识 555

30.2.1 通配符 556

30.2.2 花括号展开式 556

30.2.3 特殊字符 557

30.3 使用bash变量 558

30.4 使用bash操作符 561

30.4.1 字符串操作符 561

30.4.2 模式匹配操作符 562

30.5 流控制 564

30.5.1 条件执行:if 564

30.5.2 确定性循环:for 568

30.5.3 不确定性循环:while和until 569

30.5.4 选择结构:case和select 569

30.6 shell函数 572

30.7 输入与输出 573

30.7.1 i/o重定向 573

30.7.2 字符串i/o 574

30.8 命令行处理 576

30.9 进程和作业控制 578

30.9.1 shell的信号处理 578

30.9.2 使用trap 578

30.10 小结 580

第31章 设备驱动程序 581

31.1 驱动程序的类型 581

31.1.1 静态链接的内核设备驱动程序 581

31.1.2 可加载的内核模块 582

31.1.3 共享库 582

31.1.4 无特权用户模式程序 582

31.1.5 特权用户模式程序 583

31.1.6 守护进程 583

31.1.7 字符设备与块设备的对比 583

31.2 怎样构造硬件 583

31.2.1 理解步进电机的工作原理 584

31.2.2 标准的或双向的并口 586

31.3 建立开发环境 588

31.4 调试内核级驱动程序 589

31.5 设备驱动程序内幕 589

31.5.1 低层端口的i/o 589

31.5.2 使用dma访问内存 591

31.5.3 引发使用设备驱动程序的中断 591

31.5.4 设备驱动程序分层 592

31.6 简单的用户模式测试驱动程序 593

31.7 创建内核驱动程序 594

31.7.1 查看源代码 594

31.7.2 编译驱动程序 619

31.7.3 使用内核驱动程序 620

31.7.4 未来发展方向 621

31.8 其他信息资源 621

31.9 小结 622

第7部分 补充内容

第32章 软件包管理 623

32.1 理解tar文件 623

32.1.1 创建tar文件 624

32.1.2 更新tar文件 625

32.1.3 列出tar文件的内容 626

32.1.4 从一个存档文件解出文件 627

32.2 理解install命令 628

32.3 理解red hat包管理器(rpm) 630

32.3.1 rpm是什么 630

32.3.2 最小要求 631

32.3.3 配置rpm 631

32.3.4 控制构造过程:使用spec文件 633

32.3.5 分析一个spec文件 634

32.3.6 构造软件包 637

32.4 文件层次结构标准 637

32.5 小结 639

第33章 建档 640

33.1 编写手册页面 640

33.1.1 手册页面的组成 640

33.1.2 手册页面的例子 641

33.1.3 使用groff命令 643

33.1.4 linux约定 644

33.2 使用docbook 645

33.2.1 docbook是什么 646

33.2.2 docbook标记 646

33.2.3 docbook文档示例 647

33.2.4 生成输出 653

33.3 小结 653

第34章 许可证的发放 654

34.1 介绍和弃权 654

34.2 mit/x风格的许可证 654

34.3 bsd风格的许可证 655

34.4 artistic的许可证 656

34.5 gnu通用公共许可证 656

34.5.1 gnu通用公共许可证(gpl)657

34.5.2 gnu库通用公共许可证(lgpl)658

34.6 开发源代码的定义 658

34.7 小结 660





已确认勘误

次印刷

页码 勘误内容 提交人 修订印次

GNU/Linux编程指南:入门·应用·精通
    • 名称
    • 类型
    • 大小

    光盘服务联系方式: 020-38250260    客服QQ:4006604884

    意见反馈

    14:15

    关闭

    云图客服:

    尊敬的用户,您好!您有任何提议或者建议都可以在此提出来,我们会谦虚地接受任何意见。

    或者您是想咨询:

    用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问

    Video Player
    ×
    Audio Player
    ×
    pdf Player
    ×
    Current View

    看过该图书的还喜欢

    some pictures

    解忧杂货店

    东野圭吾 (作者), 李盈春 (译者)

    loading icon