《Linux/UNIX系统编程手册 上》PDF下载

  • 购买积分:17 如何计算积分?
  • 作  者:(德)MICHAELKERRISK著;孙剑,许从年,董健等译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2014
  • ISBN:7115328670
  • 页数:572 页
图书介绍:本书是介绍LINUX与UNIX编程接口的权威著作……

第1章 历史和标准 1

1.1 UNIX和C语言简史 1

1.2 Linux简史 4

1.2.1 GNU项目 4

1.2.2 Linux内核 5

1.3 标准化 8

1.3.1 C编程语言 8

1.3.2 首个POSIX标准 9

1.3.3 X/Open公司和The Open Group 10

1.3.4 SUSv3和POSIX.1-2001 10

1.3.5 SUSv4和POSIX.1-2008 12

1.3.6 UNIX标准时间表 12

1.3.7 实现标准 14

1.3.8 Linux、标准、Linux标准规范(Linux Standard Base) 14

1.4 总结 15

第2章 基本概念 17

2.1 操作系统的核心——内核 17

2.2 shell 19

2.3 用户和组 20

2.4 单根目录层级、目录、链接及文件 21

2.5 文件I/O模型 23

2.6 程序 24

2.7 进程 25

2.8 内存映射 27

2.9 静态库和共享库 28

2.10 进程间通信及同步 28

2.11 信号 29

2.12 线程 30

2.13 进程组和shell任务控制 30

2.14 会话、控制终端和控制进程 30

2.15 伪终端 31

2.16 日期和时间 31

2.17 客户端服务器架构 32

2.18 实时性 32

2.19 /proc文件系统 33

2.20 总结 33

第3章 系统编程概念 34

3.1 系统调用 34

3.2 库函数 36

3.3 标准C语言函数库;GNU C语言函数库(glibc) 37

3.4 处理来自系统调用和库函数的错误 38

3.5 关于本书示例程序的注意事项 40

3.5.1 命令行选项及参数 40

3.5.2 常用的函数及头文件 40

3.6 可移植性问题 49

3.6.1 特性测试宏 49

3.6.2 系统数据类型 51

3.6.3 其他的可移植性问题 53

3.7 总结 54

3.8 练习 55

第4章 文件I/O:通用的I/O模型 56

4.1 概述 56

4.2 通用I/O 58

4.3 打开一个文件:open() 58

4.3.1 open()调用中的flags参数 60

4.3.2 open()函数的错误 63

4.3.3 creat()系统调用 64

4.4 读取文件内容:read() 64

4.5 数据写入文件:write() 65

4.6 关闭文件:close() 66

4.7 改变文件偏移量:lseek() 66

4.8 通用I/O模型以外的操作:ioctl() 70

4.9 总结 71

4.10 练习 71

第5章 深入探究文件I/O 72

5.1 原子操作和竞争条件 72

5.2 文件控制操作:fcntl() 75

5.3 打开文件的状态标志 75

5.4 文件描述符和打开文件之间的关系 76

5.5 复制文件描述符 78

5.6 在文件特定偏移量处的I/O:pread()和pwrite() 80

5.7 分散输入和集中输出(Scatter-Gather I/O):readv()和writev() 81

5.8 截断文件:truncate()和ftruncate()系统调用 84

5.9 非阻塞I/O 84

5.10 大文件I/O 85

5.11 /dev/fd目录 88

5.12 创建临时文件 88

5.13 总结 90

5.14 练习 90

第6章 进程 92

6.1 进程和程序 92

6.2 进程号和父进程号 93

6.3 进程内存布局 94

6.4 虚拟内存管理 97

6.5 栈和栈帧 99

6.6 命令行参数(argc,argv) 99

6.7 环境列表 101

6.8 执行非局部跳转:setjmp()和longjmp() 106

6.9 总结 111

6.9 练习 112

第7章 内存分配 113

7.1 在堆上分配内存 113

7.1.1 调整program break:brk()和sbrk() 113

7.1.2 在堆上分配内存:malloc()和free() 114

7.1.3 malloc()和free()的实现 117

7.1.4 在堆上分配内存的其他方法 120

7.2 在堆栈上分配内存:alloca() 122

7.3 总结 123

7.4 练习 123

第8章 用户和组 124

8.1 密码文件:/etc/passwd 124

8.2 shadow密码文件:/etc/shadow 125

8.3 组文件:/etc/group 126

8.4 获取用户和组的信息 127

8.5 密码加密和用户认证 132

8.6 总结 135

8.7 练习 135

第9章 进程凭证 136

9.1 实际用户ID和实际组ID 136

9.2 有效用户ID和有效组ID 136

9.3 Set-User-ID和Set-Group-ID程序 137

9.4 保存set-user-ID和保存set-group-ID 138

9.5 文件系统用户ID和组ID 139

9.6 辅助组ID 140

9.7 获取和修改进程凭证 140

9.7.1 获取和修改实际、有效和保存设置标识 140

9.7.2 获取和修改文件系统ID 145

9.7.3 获取和修改辅助组ID 145

9.7.4 修改进程凭证的系统调用总结 146

9.7.5 示例:显示进程凭证 148

9.8 总结 149

9.9 习题 150

第10章 时间 151

10.1 日历时间(CalendarTime) 151

10.2 时间转换函数 153

10.2.1 将time t转换为可打印格式 153

10.2.2 time t和分解时间之间的转换 154

10.2.3 分解时间和打印格式之间的转换 155

10.3 时区 161

10.4 地区(Locale) 163

10.5 更新系统时钟 167

10.6 软件时钟(jiffies) 168

10.7 进程时间 168

10.8 总结 171

10.9 练习 172

第11章 系统限制和选项 173

11.1 系统限制 174

11.2 在运行时获取系统限制(和选项) 176

11.3 运行时获取与文件相关的限制(和选项) 178

11.4 不确定的限制 179

11.5 系统选项 180

11.6 总结 181

11.7 练习 182

第12章 系统和进程信息 183

12.1 /proc文件系统 183

12.1.1 获取与进程有关的信息:/proc/PID 183

12.1.2 /proc目录下的系统信息 185

12.1.3 访问/proc文件 186

12.2 系统标识:uname() 188

12.3 总结 190

12.4 练习 190

第13章 文件I/O缓冲 191

13.1 文件I/O的内核缓冲:缓冲区高速缓存 191

13.2 stdio库的缓冲 194

13.3 控制文件I/O的内核缓冲 196

13.4 I/O缓冲小结 200

13.5 就I/O模式向内核提出建议 201

13.6 绕过缓冲区高速缓存:直接I/O 202

13.7 混合使用库函数和系统调用进行文件I/O 204

13.8 总结 205

13.9 练习 205

第14章 系统编程概念 207

14.1 设备专用文件(设备文件) 207

14.2 磁盘和分区 208

14.3 文件系统 209

14.4 i节点 211

14.5 虚拟文件系统(VFS) 213

14.6 日志文件系统 214

14.7 单根目录层级和挂载点 215

14.8 文件系统的挂载和卸载 216

14.8.1 挂载文件系统:mount() 217

14.8.2 卸载文件系统:umount()和umount2() 222

14.9 高级挂载特性 223

14.9.1 在多个挂载点挂载文件系统 224

14.9.2 多次挂载同一挂载点 224

14.9.3 基于每次挂载的挂载标志 225

14.9.4 绑定挂载 225

14.9.5 递归绑定挂载 226

14.10 虚拟内存文件系统:tmpfs 227

14.11 获得与文件系统有关的信息:statvfs() 228

14.12 总结 229

14.13 练习 230

第15章 文件属性 231

15.1 获取文件信息:stat() 231

15.2 文件时间戳 236

15.2.1 使用utime()和utimes()来改变文件时间戳 238

15.2.2 使用utimensat()和futimens()改变文件时间戳 239

15.3 文件属主 241

15.3.1 新建文件的属主 241

15.3.2 改变文件属主:chown()、fchown()和lchown() 241

15.4 文件权限 244

15.4.1 普通文件的权限 244

15.4.2 目录权限 246

15.4.3 权限检查算法 246

15.4.4 检查对文件的访问权限:access() 248

15.4.5 Set-User-ID、Set-Group-ID和Sticky位 249

15.4.6 进程的文件模式创建掩码:umask() 249

15.4.7 更改文件权限:chmod()和fchmod() 251

15.5 I节点标志(ext2扩展文件属性) 252

15.6 总结 256

15.7 练习 256

第16章 扩展属性 258

16.1 概述 258

16.2 扩展属性的实现细节 260

16.3 操控扩展属性的系统调用 260

16.4 总结 264

16.5 练习 264

第17章 访问控制列表 265

17.1 概述 265

17.2 ACL权限检查算法 267

17.3 ACL的长、短文本格式 268

17.4 ACLmask型ACE和ACL组分类 269

17.5 getfacl和setfacl命令 270

17.6 默认ACL与文件创建 271

17.7 ACL在实现方面的限制 272

17.8 ACLAPI 273

17.9 总结 280

17.10 练习 280

第18章 目录与链接 281

18.1 目录和(硬)链接 281

18.2 符号(软)链接 283

18.3 创建和移除(硬)链接:link()和unlink() 286

18.4 更改文件名:rename() 289

18.5 使用符号链接:symlink()和readlink() 290

18.6 创建和移除目录:mkdir()和rmdir() 291

18.7 移除一个文件或目录:remove() 292

18.8 读目录:opendir()和readdir() 292

18.9 文件树遍历:nftw() 297

18.10 进程的当前工作目录 301

18.11 针对目录文件描述符的相关操作 303

18.12 改变进程的根目录:chroot() 304

18.13 解析路径名:realpath() 306

18.14 解析路径名字符串:dirname()和basename() 307

18.15 总结 309

18.16 练习 309

第19章 监控文件事件 311

19.1 概述 311

19.2 inotify API 312

19.3 inotify事件 313

19.4 读取inotify事件 315

19.5 队列限制和/proc文件 319

19.6 监控文件的旧有系统:dnotify 320

19.7 总结 320

19.8 练习 320

第20章 信号:基本概念 321

20.1 概念和概述 321

20.2 信号类型和默认行为 323

20.3 改变信号处置:signal() 329

20.4 信号处理器简介 330

20.5 发送信号:kill() 333

20.6 检查进程的存在 334

20.7 发送信号的其他方式:raise()和killpg() 335

20.8 显示信号描述 336

20.9 信号集 337

20.10 信号掩码(阻塞信号传递) 339

20.11 处于等待状态的信号 341

20.12 不对信号进行排队处理 341

20.13 改变信号处置:sigaction() 345

20.14 等待信号:pause() 346

20.15 总结 347

20.16 练习 347

第21章 信号:信号处理器函数 348

21.1 设计信号处理器函数 348

21.1.1 再论信号的非队列化处理 348

21.1.2 可重入函数和异步信号安全函数 349

21.1.3 全局变量和sig atomic t数据类型 353

21.2 终止信号处理器函数的其他方法 354

21.2.1 在信号处理器函数中执行非本地跳转 354

21.2.2 异常终止进程:abort() 358

21.3 在备选栈中处理信号:sigaltstack() 358

21.4 SA SIGINFO标志 361

21.5 系统调用的中断和重启 366

21.6 总结 368

21.7 练习 369

第22章 信号:高级特性 370

22.1 核心转储文件 370

22.2 传递、处置及处理的特殊情况 372

22.3 可中断和不可中断的进程睡眠状态 373

22.4 硬件产生的信号 374

22.5 信号的同步生成和异步生成 374

22.6 信号传递的时机与顺序 375

22.7 signal()的实现及可移植性 376

22.8 实时信号 378

22.8.1 发送实时信号 379

22.8.2 处理实时信号 380

22.9 使用掩码来等待信号:sigsuspend() 384

22.10 以同步方式等待信号 387

22.11 通过文件描述符来获取信号 390

22.12 利用信号进行进程间通信 393

22.13 早期的信号API(System V和BSD) 393

22.14 总结 395

22.15 练习 396

第23章 定时器与休眠 397

23.1 间隔定时器 397

23.2 定时器的调度及精度 402

23.3 为阻塞操作设置超时 402

23.4 暂停运行(休眠)一段固定时间 404

23.4.1 低分辨率休眠:sleep() 404

23.4.2 高分辨率休眠:nanosleep() 404

23.5 POSIX时钟 407

23.5.1 获取时钟的值:clock_gettime() 407

23.5.2 设置时钟的值:clock_settime() 408

23.5.3 获取特定进程或线程的时钟ID 408

23.5.4 高分辨率休眠的改进版:clock_nanosleep() 409

23.6 POSIX间隔式定时器 410

23.6.1 创建定时器:timer_create() 410

23.6.2 配备和解除定时器:timer_settime() 412

23.6.3 获取定时器的当前值:timer_gettime() 413

23.6.4 删除定时器:timer_delete() 413

23.6.5 通过信号发出通知 414

23.6.6 定时器溢出 417

23.6.7 通过线程来通知 417

23.7 利用文件描述符进行通知的定时器:timerfd API 420

23.8 总结 423

23.9 练习 424

第24章 进程的创建 425

24.1 fork()、exit()、wait()以及execve()的简介 425

24.2 创建新进程:fork() 427

24.2.1 父、子进程间的文件共享 428

24.2.2 fork()的内存语义 430

24.3 系统调用vfork() 433

24.4 fork()之后的竞争条件(Race Condition) 434

24.5 同步信号以规避竞争条件 436

24.6 总结 438

24.7 练习 439

第25章 进程的终止 440

25.1 进程的终止:_exit()和exit() 440

25.2 进程终止的细节 441

25.3 退出处理程序 442

25.4 fork()、stdio缓冲区以及_exit()之间的交互 445

25.5 总结 446

25.6 练习 446

第26章 监控子进程 447

26.1 等待子进程 447

26.1.1 系统调用wait() 447

26.1.2 系统调用waitpid() 449

26.1.3 等待状态值 450

26.1.4 从信号处理程序中终止进程 454

26.1.5 系统调用waitid() 455

26.1.6 系统调用wait3()和wait4() 456

26.2 孤儿进程与僵尸进程 457

26.3 SIGCHLD信号 459

26.3.1 为SIGCHLD建立信号处理程序 459

26.3.2 向已停止的子进程发送SIGCHLD信号 462

26.3.3 忽略终止的子进程 462

26.4 总结 464

26.5 练习 464

第27章 程序的执行 465

27.1 执行新程序:execve() 465

27.2 exec()库函数 468

27.2.1 环境变量PATH 469

27.2.2 将程序参数指定为列表 470

27.2.3 将调用者的环境传递给新程序 471

27.2.4 执行由文件描述符指代的程序:fexecve() 471

27.3 解释器脚本 472

27.4 文件描述符与exec() 474

27.5 信号与exec() 477

27.6 执行shell命令:system() 477

27.7 system()的实现 480

27.8 总结 485

27.9 练习 485

第28章 详述进程创建和程序执行 487

28.1 进程记账 487

28.2 系统调用clone() 493

28.2.1 clone()的flags参数 497

28.2.2 因克隆生成的子进程而对waitpid()进行的扩展 503

28.3 进程的创建速度 503

28.4 exec()和fork()对进程属性的影响 505

28.5 总结 508

28.6 练习 508

第29章 线程:介绍 509

29.1 概述 509

29.2 Pthreads API的详细背景 511

29.3 创建线程 513

29.4 终止线程 514

29.5 线程ID(Thread ID) 514

29.6 连接(joining)已终止的线程 515

29.7 线程的分离 517

29.8 线程属性 518

29.9 线程VS进程 518

29.10 总结 519

29.11 练习 519

第30章 线程:线程同步 521

30.1 保护对共享变量的访问:互斥量 521

30.1.1 静态分配的互斥量 524

30.1.2 加锁和解锁互斥量 524

30.1.3 互斥量的性能 526

30.1.4 互斥量的死锁 527

30.1.5 动态初始化互斥量 527

30.1.6 互斥量的属性 528

30.1.7 互斥量类型 528

30.2 通知状态的改变:条件变量(Condition Variable) 529

30.2.1 由静态分配的条件变量 530

30.2.2 通知和等待条件变量 531

30.2.3 测试条件变量的判断条件(predicate) 534

30.2.4 示例程序:连接任意已终止线程 534

30.2.5 经由动态分配的条件变量 537

30.3 总结 538

30.4 练习 538

第31章 线程:线程安全和每线程存储 539

31.1 线程安全(再论可重入性) 539

31.2 一次性初始化 541

31.3 线程特有数据 542

31.3.1 库函数视角下的线程特有数据 542

31.3.2 线程特有数据API概述 543

31.3.3 线程特有数据API详述 543

31.3.4 使用线程特有数据API 545

31.3.5 线程特有数据的实现限制 549

31.4 线程局部存储 549

31.5 总结 550

31.6 练习 551

第32章 线程:线程取消 552

32.1 取消一个线程 552

32.2 取消状态及类型 552

32.3 取消点 553

32.4 线程可取消性的检测 556

32.5 清理函数(cleanup handler) 556

32.6 异步取消 559

32.7 总结 560

第33章 线程:更多细节 561

33.1 线程栈 561

33.2 线程和信号 562

33.2.1 UNIX信号模型如何映射到线程中 562

33.2.2 操作线程信号掩码 563

33.2.3 向线程发送信号 563

33.2.4 妥善处理异步信号 564

33.3 线程和进程控制 564

33.4 线程实现模型 566

33.5 Linux POSIX线程的实现 567

33.5.1 LinuxThreads 567

33.5.2 NPTL 569

33.5.3 哪一种线程实现 570

33.6 PthreadAPI的高级特性 572

33.7 总结 572

33.8 练习 572