Linux系统编程(第2版)

Linux系统编程(第2版) pdf epub mobi txt 电子书 下载 2026

出版者:人民邮电出版社
作者:[美] Robert Love
出品人:
页数:394
译者:祝洪凯
出版时间:2014-5-1
价格:79.00元
装帧:平装
isbn号码:9787115346353
丛书系列:
图书标签:
  • Linux
  • 系统编程
  • 编程
  • Linux/Unix
  • 计算机科学
  • 计算机
  • UNIX
  • 程序设计
  • Linux
  • 系统编程
  • C语言
  • Unix
  • 内核
  • API
  • POSIX
  • 网络编程
  • 进程管理
  • 内存管理
  • 文件系统
想要找书就要到 小哈图书下载中心
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

系统编程是指编写系统软件,其代码在底层运行,直接跟内核和核心系统库对话。

《Linux系统编程(第2版)》是一本关于Linux系统编程的教程,也是一本介绍Linux系统调用的手册,还是一本如何实现更优雅更快代码的内幕指南。全书分为11章和2个附录,详细介绍了Linux系统编程基本概念、文件I/O、缓冲I/O、高级文件I/O、进程管理、高级进程管理、线程、文件和目录管理、信号和时间等主题。附录给出了gcc和GNU C提供的很多语言扩展,以及推荐阅读的相关书目。

《Linux系统编程(第2版)》的作者是知名的Linux内核专家,多本畅销技术图书的作者。本书需要在C编程和Linux编程环境下工作的程序员阅读,对于想要巩固基础或了解内核的高级编程人员,本书也很有参考价值。

作者简介

Robert Love在很早期就一直使用Linux并贡献代码,包括对Linux内核和GNOME桌面环境的贡献。Robert Love是Google软件工程师,是Android设计和开发团队成员。目前,他致力于Google的Web搜索架构。Robert获得了Florida大学的双学位:计算机科学理学学士和数学文学学士。

目录信息

第1章 入门和基本概念 1
1.1 系统编程 1
1.1.1 为什么要学习系统编程 2
1.1.2 系统编程的基础 2
1.1.3 系统调用 3
1.1.4 C库 3
1.1.5 C编译器 4
1.2 API和ABI 4
1.2.1 API 5
1.2.2 ABI 5
1.3 标准 6
1.3.1 POSIX和SUS的历史 6
1.3.2 C语言标准 7
1.3.3 Linux和标准 8
1.3.4 本书和标准 8
1.4 Linux编程的概念 9
1.4.1 文件和文件系统 9
1.4.2 进程 15
1.4.3 用户和组 16
1.4.4 权限 17
1.4.5 信号 18
1.4.6 进程间通信 19
1.4.7 头文件 19
1.4.8 错误处理 19
第2章 文件I/O 23
2.1 打开文件 24
2.1.1 系统调用open() 24
2.1.2 新建文件的所有者 27
2.1.3 新建文件的权限 27
2.1.4 creat()函数 30
2.1.5 返回值和错误码 30
2.2 通过read()读文件 31
2.2.1 返回值 31
2.2.2 读入所有字节 33
2.2.3 非阻塞读 33
2.2.4 其他错误码 34
2.2.5 read()调用的大小限制 34
2.3 调用write()写 35
2.3.1 部分写(Partial Write) 36
2.3.2 Append(追加)模式 36
2.3.3 非阻塞写 37
2.3.4 其他错误码 37
2.3.5 write()大小限制 38
2.3.6 write()行为 38
2.4 同步I/O 39
2.4.1 fsync()和fdatasync() 39
2.4.2 sync() 41
2.4.3 O_SYNC标志位 42
2.4.4 O_DSYNC和O_RSYNC 42
2.5 直接I/O 43
2.6 关闭文件 43
2.7 用lseek()查找 44
2.7.1 在文件末尾后查找 46
2.7.2 错误码 46
2.7.3 限制 47
2.8 定位读写 47
2.9 文件截短 48
2.10 I/O多路复用 49
2.10.1 select() 50
2.10.2 poll() 56
2.10.3 poll()和select()的区别 60
2.11 内核内幕 61
2.11.1 虚拟文件系统 61
2.11.2 页缓存 62
2.11.3 页回写 63
2.12 结束语 64
第3章 缓冲I/O 65
3.1 用户缓冲I/O 65
3.2 标准I/O 68
3.3 打开文件 69
3.4 通过文件描述符打开流 70
3.5 关闭流 71
3.6 从流中读数据 71
3.6.1 每次读取一个字节 71
3.6.2 每次读一行 72
3.6.3 读二进制文件 74
3.7 向流中写数据 75
3.7.1 写入单个字符 75
3.7.2 写入字符串 76
3.7.3 写入二进制数据 76
3.8 缓冲I/O示例程序 77
3.9 定位流 78
3.10 Flush(刷新输出)流 80
3.11 错误和文件结束 80
3.12 获取关联的文件描述符 81
3.13 控制缓冲 82
3.14 线程安全 83
3.14.1 手动文件加锁 84
3.14.2 对流操作解锁 85
3.15 对标准I/O的批评 86
3.16 结束语 87
第4章 高级文件I/O 88
4.1 分散/聚集I/O 89
4.2 Event Poll 94
4.2.1 创建新的epoll实例 94
4.2.2 控制epoll 95
4.2.3 等待epoll事件 98
4.2.4 边缘触发事件和条件触发事件 100
4.3 存储映射 101
4.3.1 mmap() 101
4.3.2 munmap() 105
4.3.3 存储映射实例 106
4.3.4 mmap()的优点 107
4.3.5 mmap()的不足 108
4.3.6 调整映射的大小 108
4.3.7 改变映射区域的权限 109
4.3.8 通过映射同步文件 110
4.3.9 给出映射提示 112
4.4 普通文件I/O提示 114
4.4.1 系统调用posix_fadvise() 114
4.4.2 readahead()系统调用 115
4.4.3 “经济实用”的操作提示 116
4.5 同步(Synchronized),同步(Synchronous)及异步(Asynchronous)操作 117
4.6 I/O调度器和I/O性能 118
4.6.1 磁盘寻址 119
4.6.2 I/O调度器的功能 120
4.6.3 改进读请求 120
4.6.4 选择和配置你的I/O调度器 123
4.6.5 优化I/O性能 124
4.7 结束语 130
第5章 进程管理 131
5.1 程序、进程和线程 131
5.2 进程ID 132
5.2.1 分配进程ID 132
5.2.2 进程体系 133
5.2.3 pid_t 133
5.2.4 获取进程ID和父进程ID 133
5.3 运行新进程 134
5.3.1 exec系统调用 134
5.3.2 fork()系统调用 138
5.4 终止进程 141
5.4.1 终止进程的其他方式 142
5.4.2 atexit() 143
5.4.3 on_exit() 144
5.4.4 SIGCHLD 144
5.5 等待子进程终止 144
5.5.1 等待特定进程 147
5.5.2 等待子进程的其他方法 149
5.5.3 BSD中的wait3()和wait4() 151
5.5.4 创建并等待新进程 152
5.5.5 僵尸进程 155
5.6 用户和组 155
5.6.1 改变实际用户/组ID和保留的用户/组ID 156
5.6.2 改变有效的用户ID或组ID 157
5.6.3 BSD改变用户ID和组ID的方式 158
5.6.4 HP-UX中改变用户ID和组ID的方式 158
5.6.5 操作用户ID/组ID的首选方法 159
5.6.6 对保留的用户ID的支持 159
5.6.7 获取用户ID和组ID 159
5.7 会话(Session)和进程组 160
5.7.1 与会话相关的系统调用 161
5.7.2 与进程组相关的系统调用 163
5.7.3 废弃的进程组函数 164
5.8 守护进程 164
5.9 结束语 167
第6章 高级进程管理 168
6.1 进程调度 168
6.1.1 时间片 169
6.1.2 I/O约束型进程和处理器约束型进程 169
6.1.3 抢占式调度 170
6.2 完全公平调度器 171
6.3 让出处理器 172
6.4 进程优先级 173
6.4.1 nice() 174
6.4.2 getpriority()和setpriority() 175
6.4.3 I/O优先级 176
6.5 处理器亲和力(Affinity) 177
6.6 实时系统 180
6.6.1 硬实时系统和软实时系统 180
6.6.2 延迟、抖动和截止期限 181
6.6.3 Linux的实时支持 182
6.6.4 Linux调度策略和优先级 182
6.6.5 设置调度参数 186
6.6.6 sched_rr_get_interval() 189
6.6.7 关于实时进程的注意事项 190
6.6.8 确定性 191
6.7 资源限制 193
6.7.1 限制项 194
6.7.2 获取和设置资源限制 198
第7章 线程 200
7.1 二进制程序、进程和线程 200
7.2 多线程 201
7.2.1 多线程代价 203
7.2.2 其他选择 203
7.3 线程模型 203
7.3.1 用户级线程模型 204
7.3.2 混合式线程模型 204
7.3.3 协同程序 205
7.4 线程模式 205
7.4.1 每个连接对应一个线程 206
7.4.2 事件驱动的线程模式 206
7.5 并发性、并行性和竞争 207
7.6 同步 210
7.6.1 互斥 211
7.6.2 死锁 212
7.7 Pthreads 214
7.7.1 Linux线程实现 214
7.7.2 Pthread API 215
7.7.3 链接Pthreads 216
7.7.4 创建线程 216
7.7.5 线程ID 217
7.7.6 终止线程 218
7.7.7 join(加入)线程和detach(分离)线程 221
7.7.8 线程编码实例 223
7.7.9 Pthread互斥 224
7.8 进一步研究 227
第8章 文件和目录管理 228
8.1 文件及其元数据 228
8.1.1 一组stat函数 229
8.1.2 权限 233
8.1.3 所有权 234
8.1.4 扩展属性 237
8.1.5 扩展属性操作 239
8.2 目录 245
8.2.1 获取当前工作目录 246
8.2.2 创建目录 251
8.2.3 删除目录 252
8.2.4 读取目录内容 253
8.3 链接 256
8.3.1 硬链接 256
8.3.2 符号链接 258
8.3.3 解除链接 259
8.4 拷贝和移动文件 261
8.4.1 拷贝 261
8.4.2 移动 261
8.5 设备节点 263
8.5.1 特殊设备节点 264
8.5.2 随机数生成器 264
8.6 带外通信(Out-of-Band Communication) 265
8.7 监视文件事件 266
8.7.1 初始化inotify 267
8.7.2 监视 268
8.7.3 inotify事件 270
8.7.4 高级监视选项 273
8.7.5 删除inotify监视 273
8.7.6 获取事件队列大小 274
8.7.7 销毁inotify实例 274
第9章 内存管理 276
9.1 进程地址空间 276
9.1.1 页和页面调度 276
9.1.2 内存区域 278
9.2 动态内存分配 279
9.2.1 数组分配 281
9.2.2 调整已分配内存大小 282
9.2.3 释放动态内存 283
9.2.4 对齐 285
9.3 数据段的管理 289
9.4 匿名内存映射 290
9.4.1 创建匿名内存映射 291
9.4.2 映射到设备文件/dev/zero 293
9.5 高级内存分配 294
9.5.1 调试内存分配 297
9.5.2 获取统计信息 297
9.6 基于栈的分配 298
9.6.1 把字符串复制到栈中 300
9.6.2 变长数组 301
9.7 选择合适的内存分配机制 302
9.8 内存操作 303
9.8.1 字节设置 303
9.8.2 字节比较 304
9.8.3 字节移动 305
9.8.4 字节查找 306
9.8.5 字节加密 306
9.9 内存锁定 307
9.9.1 锁定部分地址空间 307
9.9.2 锁定全部地址空间 308
9.9.3 内存解锁 309
9.9.4 锁的限制 310
9.9.5 该页在物理内存中吗 310
9.10 投机性内存分配策略 311
第10章 信号 313
10.1 信号相关的概念 313
10.1.1 信号标识符 314
10.1.2 Linux支持的信号 315
10.2 基本信号管理 320
10.2.1 等待信号 321
10.2.2 示例 322
10.2.3 执行和继承 324
10.2.4 把信号编号映射为字符串 325
10.3 发送信号 326
10.3.1 权限 326
10.3.2 示例 327
10.3.3 给进程本身发送信号 327
10.3.4 给整个进程组发送信号 327
10.4 重入 328
10.5 信号集 330
10.5.1 更多的信号集函数 331
10.5.2 获取待处理信号 332
10.5.3 等待信号集 333
10.6 高级信号管理 333
10.6.1 结构体siginfo_t 336
10.6.2 si_code的相关说明 338
10.6.3 发送带附加信息(payload)的信号 342
10.6.4 示例 343
10.7 信号是个UNIX“瑕疵”吗 343
第11章 时间 345
11.1 时间的数据结构 347
11.1.1 原始表示 348
11.1.2 微秒级精度 348
11.1.3 更精确的:纳秒级精度 348
11.1.4 对时间进行分解 349
11.1.5 进程时间类型 350
11.2 POSIX时钟 351
11.3 时间源精度 351
11.4 取得当前时间 353
11.4.1 更好的接口 353
11.4.2 高级接口 354
11.4.3 获取进程时间 355
11.5 设置当前时间 356
11.5.1 设置支持高精度的时间 356
11.5.2 设置时间的高级接口 357
11.6 玩转时间 358
11.7 睡眠和等待 363
11.7.1 以微秒级精度睡眠 363
11.7.2 以纳秒级精度睡眠 365
11.7.3 实现睡眠的高级方法 366
11.7.4 sleep的可移植实现 368
11.7.5 超时(Overrun) 368
11.7.6 睡眠的其他方式 369
11.8 定时器 369
11.8.1 简单的闹钟 369
11.8.2 计时器(interval timer) 370
11.8.3 高级定时器 372
附录A C语言的GCC扩展 378
附录B 参考书目 390
· · · · · · (收起)

读后感

评分

没觉得有多特别,后来发现LKD也是作者的作品,所以静下心来读,这书还是很不错的。 买了一堆Unix编程的书,都没有好好读过。 这次要看完这本。加油。

评分

评分

http://linuxtoy.org/archives/linux-system-programming-chinese-edition.html  

评分

以前受到amazon上评论的影响,一直以为这就是本API Reference,所以买来后一直都没翻过。前几天偶然翻看,才发觉误会了。这不是类似APUE那种手把手教你的书,这本书中往往是用短短的一段话来陈述了一些概念背后的东西,注意,是“陈述”,没有循循善诱。所以看此书之前最好还是...  

评分

以前受到amazon上评论的影响,一直以为这就是本API Reference,所以买来后一直都没翻过。前几天偶然翻看,才发觉误会了。这不是类似APUE那种手把手教你的书,这本书中往往是用短短的一段话来陈述了一些概念背后的东西,注意,是“陈述”,没有循循善诱。所以看此书之前最好还是...  

用户评价

评分

这本书的价值在于它构建了一个完整的、自洽的Linux程序执行模型。很多教程只会告诉你“这样做就行”,但这本书会告诉你“为什么必须这样做,以及如果不这样做会有什么后果”。举例来说,关于进程间通信(IPC)的部分,作者没有仅仅停留在管道和消息队列的表面,而是深入探讨了共享内存的同步与互斥机制,特别是使用信号量和互斥锁来保护共享数据的正确性,这些都是并发编程中“陷阱”最多的地方。我过去经常因为锁的粒度不对导致死锁或活锁,但通过对书中关于并发控制模型章节的反复研读,我现在的代码在处理多线程共享资源时,信心大增,健壮性也提高了一个档次。它对错误码处理的强调也值得称道,教会读者如何优雅地从系统调用失败中恢复,这在生产环境中是决定软件可靠性的关键因素。

评分

这本书简直是C语言学习者的福音!我之前在学习指针和内存管理时吃了不少苦头,感觉代码写起来总是小心翼翼,生怕哪里出了问题。但自从开始啃这本教材后,那种对底层运行机制的模糊感一下子就被扫清了。作者对于操作系统内核的讲解非常到位,不是那种干巴巴的理论堆砌,而是通过大量生动的例子和代码片段,让你亲手去感受进程、线程是如何在Linux环境下调度和协作的。特别是关于信号处理和I/O多路复用的章节,简直是醍醐灌顶,我终于明白了为什么在高性能网络应用中,epoll会比select和poll更受欢迎,以及在实际项目中如何设计出健壮的错误恢复机制。阅读过程中,我常常需要对照着终端敲代码运行,每当看到自己写的小程序能够按照预期在多进程环境中正确通信时,那种成就感是无与伦比的。这本书的深度足以让你从一个只会调用标准库函数的“用户”蜕变成一个能理解系统调用背后逻辑的“工程师”。唯一的不足可能就是对于一些非常前沿的容器化技术涉及不多,但就系统编程的核心基础而言,它已经做到了极致。

评分

对于已经工作了一段时间的开发者来说,这本书更像是一本高效的“反向工程”指南。我们很多时候都在用别人封装好的框架,时间久了,很多底层细节就生疏了。我拿这本书来回顾网络编程,特别是TCP/IP协议栈在Linux内核中的实现细节,真是受益匪浅。比如,书中对Socket编程中各种超时机制和缓冲区管理的讲解,清晰地揭示了为什么在并发访问高负载服务器时,不恰当的缓冲区设置会导致性能急剧下降。我对照着书中的描述,去查看了我当前项目中正在使用的某个网络库的源码,瞬间就明白了他们设计选择背后的考量,这极大地提升了我排查复杂网络问题的能力。这本书的语言风格是极其严谨的,每一句话似乎都经过了深思熟虑,没有一句废话,这对于时间宝贵的职场人士来说,简直是效率的保证。它不是一本让你快速入门的“速成手册”,而是一本需要你带着实际问题去钻研的“工具书”。

评分

说实话,初次接触这本书时,我对它抱有很高的期望,毕竟“系统编程”这四个字本身就带着一种硬核的魅力。读完前几章,我深刻体会到作者在体系结构上的扎实功底。它没有陷入Linux发行版之间细微差别的泥潭,而是聚焦于POSIX标准和Linux内核提供的通用接口,这使得书中的知识具有极强的普适性和生命力。我特别欣赏它对文件系统操作的详尽阐述,从`open`到`mmap`,每一步的系统调用参数和返回值处理都被剖析得淋漓尽致,这对于编写需要持久化存储或高性能数据流的应用至关重要。我尝试着用书中的方法重写了一个之前用Python写的简易日志记录器,纯C语言版本的代码不仅运行速度快了不止一个数量级,而且在内存占用上也控制得非常好,这让我彻底理解了为什么说C语言是系统软件的基石。对于希望深入理解操作系统课程中那些抽象概念(比如虚拟内存、中断处理)的读者,这本书提供了一个绝佳的、可操作的实践平台。

评分

我发现这本书在介绍工具链和调试技巧方面也做得非常出色。系统编程往往意味着你在与比你低一个层次的软件打交道,这意味着你必须学会使用像GDB这样的强大工具来深入剖析程序在内核态的运行状态。书中关于如何设置断点、监视寄存器以及跟踪系统调用的具体命令行操作,详细而实用,完全可以作为GDB的实战教程来使用。更重要的是,它教会了我如何阅读和理解内核的错误信息和堆栈回溯,这在处理那些没有明显错误提示的内存泄漏或段错误时,是救命稻草。这本书的结构设计非常巧妙,它从用户空间API入手,逐步深入到内核的接口,这种由表及里的学习路径,让初学者不会因为起点太低而感到无聊,也不会因为目标太高而感到望而却步。它成功地将理论的严谨性与实践的动手性完美地结合在一起,是系统编程领域无可替代的参考读物。

评分

两个翻译版本,都是渣翻译!糟蹋好书的行为简直令人发指!

评分

两个翻译版本,都是渣翻译!糟蹋好书的行为简直令人发指!

评分

man

评分

英文版不难的。 不得不说后面几章翻译的越来越挫了。

评分

初读了一下,文件/io/内存/进程/信号/ 管理与实现

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 qciss.net All Rights Reserved. 小哈图书下载中心 版权所有