logo资料库

Linux-UNIX系统编程手册.pdf

第1页 / 共1224页
第2页 / 共1224页
第3页 / 共1224页
第4页 / 共1224页
第5页 / 共1224页
第6页 / 共1224页
第7页 / 共1224页
第8页 / 共1224页
资料共1224页,剩余部分请下载后查看
上册
封面
版权声明
内容提要
献 辞
对本书的赞誉
前 言
目 录
第1章 历史和标准
1.1 UNIX 和C 语言简史
1.2 Linux 简史
1.2.1 GNU 项目
1.2.2 Linux 内核
1.3 标准化
1.3.1 C 编程语言
1.3.2 首个POSIX 标准
1.3.3 X/Open 公司和The Open Group
1.3.4 SUSv3 和POSIX.1-2001
1.3.5 SUSv4 和POSIX.1-2008
1.3.6 UNIX 标准时间表
1.3.7 实现标准
1.3.8 Linux、标准、Linux 标准规范(Linux Standard Base)
1.4 总结
第2章 基本概念
2.1 操作系统的核心—内核
2.2 shell
2.3 用户和组
2.4 单根目录层级、目录、链接及文件
2.5 文件I/O 模型
2.6 程序
2.7 进程
2.8 内存映射
2.9 静态库和共享库
2.10 进程间通信及同步
2.11 信号
2.12 线程
2.13 进程组和shell 任务控制
2.14 会话、控制终端和控制进程
2.15 伪终端
2.16 日期和时间
2.17 客户端/服务器架构
2.18 实时性
2.19 /proc 文件系统
2.20 总结
第3章 系统编程概念
3.1 系统调用
3.2 库函数
3.3 标准C 语言函数库;GNU C 语言函数库(glibc)
3.4 处理来自系统调用和库函数的错误
3.5 关于本书示例程序的注意事项
3.5.1 命令行选项及参数
3.5.2 常用的函数及头文件
3.6 可移植性问题
3.6.1 特性测试宏
3.6.2 系统数据类型
3.6.3 其他的可移植性问题
3.7 总结
3.8 练习
第4 章文件I/O:通用的I/O 模型
4.1 概述
4.2 通用I/O
4.3 打开一个文件:open()
4.3.1 open()调用中的flags 参数
4.3.2 open()函数的错误
4.3.3 creat()系统调用
4.4 读取文件内容:read()
4.5 数据写入文件:write()
4.6 关闭文件:close()
4.7 改变文件偏移量:lseek()
4.8 通用I/O 模型以外的操作:ioctl()
4.9 总结
4.10 练习
第5章 深入探究文件 I/O
5.1 原子操作和竞争条件
5.2 文件控制操作:fcntl()
5.3 打开文件的状态标志
5.4 文件描述符和打开文件之间的关系
5.5 复制文件描述符
5.6 在文件特定偏移量处的I/O:pread()和pwrite()
5.7 分散输入和集中输出(Scatter-Gather I/O):readv()和writev()
5.8 截断文件:truncate()和ftruncate()系统调用
5.9 非阻塞I/O
5.10 大文件I/O
5.11 /dev/fd 目录
5.12 创建临时文件
5.13 总结
5.14 练习
第6章 进程
6.1 进程和程序
6.2 进程号和父进程号
6.3 进程内存布局
6.4 虚拟内存管理
6.5 栈和栈帧
6.6 命令行参数(argc, argv)
6.7 环境列表
6.8 执行非局部跳转:setjmp()和longjmp()
6.9 总结
6.9 练习
第7章 内存分配
7.1 在堆上分配内存
7.1.1 调整program break:brk()和sbrk()
7.1.2 在堆上分配内存:malloc()和free()
7.1.3 malloc()和free()的实现
7.1.4 在堆上分配内存的其他方法
7.2 在堆栈上分配内存:alloca()
7.3 总结
7.4 练习
第8章 用户和组
8.1 密码文件:/etc/passwd
8.2 shadow 密码文件:/etc/shadow
8.3 组文件:/etc/group
8.4 获取用户和组的信息
8.5 密码加密和用户认证
8.6 总结
8.7 练习
第9章 进程凭证
9.1 实际用户ID 和实际组ID
9.2 有效用户ID 和有效组ID
9.3 Set-User-ID 和Set-Group-ID 程序
9.4 保存set-user-ID 和保存set-group-ID
9.5 文件系统用户ID 和组ID
9.6 辅助组ID
9.7 获取和修改进程凭证
9.7.1 获取和修改实际、有效和保存设置标识
9.7.2 获取和修改文件系统ID
9.7.3 获取和修改辅助组ID
9.7.4 修改进程凭证的系统调用总结
9.7.5 示例:显示进程凭证
9.8 总结
9.9 习题
第10章 时间
10.1 日历时间(Calendar Time)
10.2 时间转换函数
10.2.1 将time_t 转换为可打印格式
10.2.2 time_t 和分解时间之间的转换
10.3 时区
10.4 地区(Locale)
10.5 更新系统时钟
10.6 软件时钟(jiffies)
10.7 进程时间
10.8 总结
10.9 练习
第11章 系统限制和选项
11.1 系统限制
11.2 在运行时获取系统限制(和选项)
11.3 运行时获取与文件相关的限制(和选项)
11.4 不确定的限制
11.5 系统选项
11.6 总结
11.7 练习
第12章 系统和进程信息
12.1 /proc 文件系统
12.1.1 获取与进程有关的信息:/proc/PID
12.1.2 /proc 目录下的系统信息
12.1.3 访问/proc 文件
12.2 系统标识:uname()
12.3 总结
12.4 练习
第13章 文件 I/O 缓冲
13.1 文件I/O 的内核缓冲:缓冲区高速缓存
13.2 stdio 库的缓冲
13.3 控制文件I/O 的内核缓冲
13.4 I/O 缓冲小结
13.5 就I/O 模式向内核提出建议
13.6 绕过缓冲区高速缓存:直接I/O
13.7 混合使用库函数和系统调用进行文件I/O
13.8 总结
13.9 练习
第14章 系统编程概念
14.1 设备专用文件(设备文件)
14.2 磁盘和分区
14.3 文件系统
14.4 i 节点
14.5 虚拟文件系统(VFS)
14.6 日志文件系统
14.7 单根目录层级和挂载点
14.8 文件系统的挂载和卸载
14.8.1 挂载文件系统:mount()
14.8.2 卸载文件系统:umount()和umount2()
14.9 高级挂载特性
14.9.1 在多个挂载点挂载文件系统
14.9.2 多次挂载同一挂载点
14.9.3 基于每次挂载的挂载标志
14.9.4 绑定挂载
14.9.5 递归绑定挂载
14.10 虚拟内存文件系统:tmpfs
14.11 获得与文件系统有关的信息:statvfs()
14.12 总结
14.13 练习
第15章 文件属性
15.1 获取文件信息:stat()
15.2 文件时间戳
15.2.1 使用utime()和utimes()来改变文件时间戳
15.2.2 使用utimensat()和futimens()改变文件时间戳
15.3 文件属主
15.3.1 新建文件的属主
15.3.2 改变文件属主:chown()、fchown()和lchown()
15.4 文件权限
15.4.1 普通文件的权限
15.4.2 目录权限
15.4.3 权限检查算法
15.4.4 检查对文件的访问权限:access()
15.4.5 Set-User-ID、Set-Group-ID 和Sticky 位
15.4.6 进程的文件模式创建掩码:umask()
15.4.7 更改文件权限:chmod()和fchmod()
15.5 i 节点标志(ext2 扩展文件属性)
15.6 总结
15.7 练习
第16章 扩展属性
16.1 概述
16.2 扩展属性的实现细节
16.3 操控扩展属性的系统调用
16.4 总结
16.5 练习
第17章 访问控制列表
17.1 概述
17.2 ACL 权限检查算法
17.3 ACL 的长、短文本格式
17.4 ACL_mask 型ACE 和ACL 组分类
17.5 getfacl 和setfacl 命令
17.6 默认ACL 与文件创建
17.7 ACL 在实现方面的限制
17.8 ACL API
17.9 总结
17.10 练习
第18章 目录与链接
18.1 目录和(硬)链接
18.2 符号(软)链接
18.3 创建和移除(硬)链接:link()和 unlink()
18.4 更改文件名:rename()
18.5 使用符号链接:symlink()和readlink()
18.6 创建和移除目录:mkdir()和rmdir()
18.7 移除一个文件或目录:remove()
18.8 读目录:opendir()和readdir()
18.9 文件树遍历:nftw()
18.10 进程的当前工作目录
18.11 针对目录文件描述符的相关操作
18.12 改变进程的根目录:chroot()
18.13 解析路径名:realpath()
18.14 解析路径名字符串:dirname()和basename()
18.15 总结
18.16 练习
第19章 监控文件事件
19.1 概述
19.2 inotify API
19.3 inotify 事件
19.4 读取inotify 事件
19.5 队列限制和/proc 文件
19.6 监控文件的旧有系统:dnotify
19.7 总结
19.8 练习
第20章 信号:基本概念
20.1 概念和概述
20.2 信号类型和默认行为
20.3 改变信号处置:signal()
20.4 信号处理器简介
20.5 发送信号:kill()
20.6 检查进程的存在
20.7 发送信号的其他方式:raise()和killpg()
20.8 显示信号描述
20.9 信号集
20.10 信号掩码(阻塞信号传递)
20.11 处于等待状态的信号
20.12 不对信号进行排队处理
20.13 改变信号处置:sigaction ()
20.14 等待信号:pause()
20.15 总结
20.16 练习
第21章 信号:信号处理器函数
21.1 设计信号处理器函数
21.1.1 再论信号的非队列化处理
21.1.2 可重入函数和异步信号安全函数
21.1.3 全局变量和sig_atomic_t 数据类型
21.2 终止信号处理器函数的其他方法
21.2.1 在信号处理器函数中执行非本地跳转
21.2.2 异常终止进程:abort()
21.3 在备选栈中处理信号:sigaltstack()
21.4 SA_SIGINFO 标志
21.5 系统调用的中断和重启
21.6 总结
21.7 练习
第22章 信号:高级特性
22.1 核心转储文件
22.2 传递、处置及处理的特殊情况
22.3 可中断和不可中断的进程睡眠状态
22.4 硬件产生的信号
22.5 信号的同步生成和异步生成
22.6 信号传递的时机与顺序
22.7 signal()的实现及可移植性
22.8 实时信号
22.8.1 发送实时信号
22.8.2 处理实时信号
22.9 使用掩码来等待信号:sigsuspend()
22.10 以同步方式等待信号
22.11 通过文件描述符来获取信号
22.12 利用信号进行进程间通信
22.13 早期的信号API(System V 和BSD)
22.14 总结
22.15 练习
第23章 定时器与休眠
23.1 间隔定时器
23.2 定时器的调度及精度
23.3 为阻塞操作设置超时
23.4 暂停运行(休眠)一段固定时间
23.4.1 低分辨率休眠:sleep()
23.4.2 高分辨率休眠:nanosleep()
23.5 POSIX 时钟
23.5.1 获取时钟的值:clock_gettime()
23.5.2 设置时钟的值:clock_settime()
23.5.3 获取特定进程或线程的时钟ID
23.6 POSIX 间隔式定时器
23.6.1 创建定时器:timer_create()
23.6.2 配备和解除定时器:timer_settime()
23.6.3 获取定时器的当前值:timer_gettime()
23.6.4 删除定时器:timer_delete()
23.6.5 通过信号发出通知
23.6.6 定时器溢出
23.6.7 通过线程来通知
23.7 利用文件描述符进行通知的定时器:timerfd API
23.8 总结
23.9 练习
第24章 进程的创建
24.1 fork()、exit()、wait()以及execve()的简介
24.2 创建新进程:fork()
24.2.1 父、子进程间的文件共享
24.2.2 fork()的内存语义
24.3 系统调用vfork()
24.4 fork()之后的竞争条件(Race Condition)
24.5 同步信号以规避竞争条件
24.6 总结
24.7 练习
第25章 进程的终止
25.1 进程的终止:_exit()和exit()
25.2 进程终止的细节
25.3 退出处理程序
25.4 fork()、stdio 缓冲区以及_exit()之间的交互
25.5 总结
25.6 练习
第26章 监控子进程
26.1 等待子进程
26.1.1 系统调用wait()
26.1.2 系统调用waitpid()
26.1.3 等待状态值
26.1.4 从信号处理程序中终止进程
26.1.5 系统调用waitid()
26.1.6 系统调用wait3()和wait4()
26.2 孤儿进程与僵尸进程
26.3 SIGCHLD 信号
26.3.1 为SIGCHLD 建立信号处理程序
26.3.2 向已停止的子进程发送SIGCHLD 信号
26.3.3 忽略终止的子进程
26.4 总结
26.5 练习
第27章 程序的执行
27.1 执行新程序:execve()
27.2 exec()库函数
27.2.1 环境变量PATH
27.2.2 将程序参数指定为列表
27.2.3 将调用者的环境传递给新程序
27.2.4 执行由文件描述符指代的程序
27.3 解释器脚本
27.4 文件描述符与exec()
27.5 信号与exec()
27.6 执行shell 命令:system()
27.7 system()的实现
27.8 总结
27.9 练习
第28 章详述进程创建和程序执行
28.1 进程记账
28.2 系统调用clone()
28.2.1 clone()的flags 参数
28.2.2 因克隆生成的子进程而对waitpid()进行的扩展
28.3 进程的创建速度
28.4 exec()和fork()对进程属性的影响
28.5 总结
28.6 练习
第29章 线程:介绍
29.1 概述
29.2 Pthreads API 的详细背景
29.3 创建线程
29.4 终止线程
29.5 线程ID(Thread ID)
29.6 连接(joining)已终止的线程
29.7 线程的分离
29.8 线程属性
29.9 线程VS 进程
29.10 总结
29.11 练习
第30章 线程:线程同步
30.1 保护对共享变量的访问:互斥量
30.1.1 静态分配的互斥量
30.1.2 加锁和解锁互斥量
30.1.3 互斥量的性能
30.1.4 互斥量的死锁
30.1.5 动态初始化互斥量
30.1.6 互斥量的属性
30.1.7 互斥量类型
30.2 通知状态的改变:条件变量(Condition Variable)
30.2.1 由静态分配的条件变量
30.2.2 通知和等待条件变量
30.2.3 测试条件变量的判断条件(predicate)
30.2.4 示例程序:连接任意已终止线程
30.2.5 经由动态分配的条件变量
30.3 总结
30.4 练习
第31章 线程:线程安全和每线程存储
31.1 线程安全(再论可重入性)
31.2 一次性初始化
31.3 线程特有数据
31.3.1 库函数视角下的线程特有数据
31.3.2 线程特有数据API 概述
31.3.3 线程特有数据API 详述
31.3.4 使用线程特有数据API
31.3.5 线程特有数据的实现限制
31.4 线程局部存储
31.5 总结
31.6 练习
第32 章线程:线程取消
32.1 取消一个线程
32.2 取消状态及类型
32.3 取消点
32.4 线程可取消性的检测
32.5 清理函数(cleanup handler)
32.6 异步取消
32.7 总结
第33 章线程:更多细节
33.1 线程栈
33.2 线程和信号
33.2.1 UNIX 信号模型如何映射到线程中
33.2.2 操作线程信号掩码
33.2.3 向线程发送信号
33.2.4 妥善处理异步信号
33.3 线程和进程控制
33.4 线程实现模型
33.5 Linux POSIX 线程的实现
33.5.1 LinuxThreads
33.5.2 NPTL
33.5.3 哪一种线程实现
33.6 Pthread API 的高级特性
33.7 总结
33.8 练习
封底
下册
封面
目 录
第34 章进程组、会话和作业控制
34.1 概述
34.2 进程组
34.3 会话
34.4 控制终端和控制进程
34.5 前台和后台进程组
34.6 SIGHUP 信号
34.6.1 在shell 中处理SIGHUP 信号
34.6.2 SIGHUP 和控制进程的终止
34.7 作业控制
34.7.1 在shell 中使用作业控制
34.7.2 实现作业控制
34.7.3 处理作业控制信号
34.7.4 孤儿进程组(SIGHUP 回顾)
34.8 总结
34.9 习题
第35 章进程优先级和调度
35.1 进程优先级(nice 值)
35.2 实时进程调度概述
35.2.1 SCHED_RR 策略
35.2.2 SCHED_FIFO 策略
35.2.3 SCHED_BATCH 和SCHED_IDLE 策略
35.3 实时进程调用API
35.3.1 实时优先级范围
35.3.2 修改和获取策略和优先级
35.3.3 释放CPU
35.3.4 SCHED_RR 时间片
35.4 CPU 亲和力
35.5 总结
35.6 习题
第36 章进程资源
36.1 进程资源使用
36.2 进程资源限制
36.3 特定资源限制细节
36.4 总结
36.5 习题
第37 章DAEMON
37.1 概述
37.2 创建一个daemon
37.3 编写daemon 指南
37.4 使用SIGHUP 重新初始化一个daemon
37.5 使用syslog 记录消息和错误
37.5.1 概述
37.5.2 syslog API
37.5.3 /etc/syslog.conf 文件
37.6 总结
37.7 习题
第38 章编写安全的特权程序
38.1 是否需要一个Set-User-ID 或Set-Group-ID 程序
38.2 以最小权限操作
38.3 小心执行程序
38.4 避免暴露敏感信息
38.5 确定进程的边界
38.6 小心信号和竞争条件
38.7 执行文件操作和文件I/O 的缺陷
38.8 不要完全相信输入和环境
38.9 小心缓冲区溢出
38.10 小心拒绝服务攻击
38.11 检查返回状态和安全地处理失败情况
38.12 总结
38.13 习题
第39 章能力
39.1 能力基本原理
39.2 Linux 能力
39.3 进程和文件能力
39.3.1 进程能力
39.3.2 文件能力
39.3.3 进程许可和有效能力集的目的
39.3.4 文件许可和有效能力集的目的
39.3.5 进程和文件可继承集的目的
39.3.6 在shell 中给文件赋予能力和查看文件能力
39.4 现代能力实现
39.5 在exec()中转变进程能力
39.5.1 能力边界集
39.5.2 保持root 语义
39.6 改变用户ID 对进程能力的影响
39.7 用编程的方式改变进程能力
39.8 创建仅包含能力的环境
39.9 发现程序所需的能力
39.10 不具备文件能力的老式内核和系统
39.11 总结
39.12 习题
第40 章登录记账
40.1 utmp 和wtmp 文件概述
40.2 utmpx API
40.3 utmpx 结构
40.4 从utmp 和wtmp 文件中检索信息
40.5 获取登录名称:getlogin()
40.6 为登录会话更新utmp 和wtmp 文件
40.7 lastlog 文件
40.8 总结
40.9 习题
第41 章共享库基础
41.1 目标库
41.2 静态库
41.3 共享库概述
41.4 创建和使用共享库——首回合
41.4.1 创建一个共享库
41.4.2 位置独立的代码
41.4.3 使用一个共享库
41.4.4 共享库soname
41.5 使用共享库的有用工具
41.6 共享库版本和命名规则
41.7 安装共享库
41.8 兼容与不兼容库比较
41.9 升级共享库
41.10 在目标文件中指定库搜索目录
41.11 在运行时找出共享库
41.12 运行时符号解析
41.13 使用静态库取代共享库
41.14 总结
41.15 习题
第42 章共享库高级特性
42.1 动态加载库
42.1.1 打开共享库:dlopen()
42.1.2 错误诊断:dlerror()
42.1.3 获取符号的地址:dlsym()
42.1.4 关闭共享库:dlclose()
42.1.5 获取与加载的符号相关的信息:dladdr()
42.1.6 在主程序中访问符号
42.2 控制符号的可见性
42.3 链接器版本脚本
42.3.1 使用版本脚本控制符号的可见性
42.3.2 符号版本化
42.4 初始化和终止函数
42.5 预加载共享库
42.6 监控动态链接器:LD_DEBUG
42.7 总结
42.8 习题
第43 章进程间通信简介
43.1 IPC 工具分类
43.2 通信工具
43.3 同步工具
43.4 IPC 工具比较
43.5 总结
43.6 习题
第 44 章管道和FIFO
44.1 概述
44.2 创建和使用管道
44.3 将管道作为一种进程同步的方法
44.4 使用管道连接过滤器
44.5 通过管道与shell 命令进行通信:popen()
44.6 管道和stdio 缓冲
44.7 FIFO
44.8 使用管道实现一个客户端/服务器应用程序
44.9 非阻塞I/O
44.10 管道和FIFO 中read()和write()的语义
44.11 总结
44.12 习题
第45 章System V IPC 介绍
45.1 概述
45.2 IPC Key
45.3 关联数据结构和对象权限
45.4 IPC 标识符和客户端/服务器应用程序
45.5 System V IPC get 调用使用的算法
45.6 ipcs 和ipcrm 命令
45.7 获取所有IPC 对象列表
45.8 IPC 限制
45.9 总结
45.10 习题
第46 章System V 消息队列
46.1 创建或打开一个消息队列
46.2 交换消息
46.2.1 发送消息
46.2.2 接收消息
46.3 消息队列控制操作
46.4 消息队列关联数据结构
46.5 消息队列的限制
46.6 显示系统中所有消息队列
46.7 使用消息队列实现客户端-服务器应用程序
46.8 使用消息队列实现文件服务器应用程序
46.9 System V 消息队列的缺点
46.10 总结
46.11 习题
第47 章System V 信号量
47.1 概述
47.2 创建或打开一个信号量集
47.3 信号量控制操作
47.4 信号量关联数据结构
47.5 信号量初始化
47.6 信号量操作
47.7 多个阻塞信号量操作的处理
47.8 信号量撤销值
47.9 实现一个二元信号量协议
47.10 信号量限制
47.11 System V 信号量的缺点
47.12 总结
47.13 习题
第48 章System V 共享内存
48.1 概述
48.2 创建或打开一个共享内存段
48.3 使用共享内存
48.4 示例:通过共享内存传输数据
48.5 共享内存在虚拟内存中的位置
48.6 在共享内存中存储指针
48.7 共享内存控制操作
48.8 共享内存关联数据结构
48.9 共享内存的限制
48.10 总结
48.11 习题
第49 章内存映射
49.1 概述
49.2 创建一个映射:mmap()
49.3 解除映射区域:munmap()
49.4 文件映射
49.4.1 私有文件映射
49.4.2 共享文件映射
49.4.3 边界情况
49.4.4 内存保护和文件访问模式交互
49.5 同步映射区域:msync()
49.6 其他mmap()标记
49.7 匿名映射
49.8 重新映射一个映射区域:mremap()
49.9 MAP_NORESERVE 和过度利用交换空间
49.10 MAP_FIXED 标记
49.11 非线性映射:remap_file_pages()
49.12 总结
49.13 习题
第50 章虚拟内存操作
50.1 改变内存保护:mprotect()
50.2 内存锁:mlock()和mlockatt()
50.3 确定内存驻留性:mincore()
50.4 建议后续的内存使用模式:madvise()
50.5 小结
50.6 习题
第51 章POSIX IPC 介绍
51.1 API 概述
51.2 System V IPC 与POSIX IPC 比较
51.3 总结
第52 OSIX 消息队列
52.1 概述
52.2 打开、关闭和断开链接消息队列
52.3 描述符和消息队列之间的关系
52.4 消息队列特性
52.5 交换消息
52.5.1 发送消息
52.5.2 接收消息
52.5.3 在发送和接收消息时设置超时时间
52.6 消息通知
52.6.1 通过信号接收通知
52.6.2 通过线程接收通知
52.7 Linux 特有的特性
52.8 消息队列限制
52.9 POSIX 和System V 消息队列比较
52.10 总结
52.11 习题
第53 章POSIX 信号量
53.1 概述
53.2 命名信号量
53.2.1 打开一个命名信号量
53.2.2 关闭一个信号量
53.2.3 删除一个命名信号量
53.3 信号量操作
53.3.1 等待一个信号量
53.3.2 发布一个信号量
53.3.3 获取信号量的当前值
53.4 未命名信号量
53.4.1 初始化一个未命名信号量
53.4.2 销毁一个未命名信号量
53.5 与其他同步技术比较
53.6 信号量的限制
53.7 总结
53.8 习题
第54 章POSIX 共享内存
54.1 概述
54.2 创建共享内存对象
54.3 使用共享内存对象
54.4 删除共享内存对象
54.5 共享内存API 比较
54.6 总结
54.7 习题
第55 章文件加锁
55.1 概述
55.2 使用flock()给文件加锁
55.2.1 锁继承与释放的语义
55.2.2 flock()的限制
55.3 使用fcntl()给记录加锁
55.3.1 死锁
55.3.2 示例:一个交互式加锁程序
55.3.3 示例:一个加锁函数库
55.3.4 锁的限制和性能
55.3.5 锁继承和释放的语义
55.3.6 锁定饿死和排队加锁请求的优先级
55.4 强制加锁
55.5 /proc/locks 文件
55.6 仅运行一个程序的单个实例
55.7 老式加锁技术
55.8 总结
55.9 习题
第56 章SOCKET:介绍
56.1 概述
56.2 创建一个socket:socket()
56.3 将socket 绑定到地址:bind()
56.4 通用socket 地址结构:struct sockaddr
56.5 流socket
56.5.1 监听接入连接:listen()
56.5.2 接受连接:accept()
56.5.3 连接到对等socket:connect()
56.5.4 流socket I/O
56.5.5 连接终止:close()
56.6 数据报socket
56.6.1 交换数据报:recvfrom 和sendto()
56.6.2 在数据报socket 上使用connect()
56.7 总结
第57 章SOCKET:UNIX DOMAIN
57.1 UNIX domain socket 地址:struct sockaddr_un
57.2 UNIX domain 中的流socket
57.3 UNIX domain 中的数据报socket
57.4 UNIX domain socket 权限
57.5 创建互联socket 对:socketpair()
57.6 Linux 抽象socket 名空间
57.7 总结
57.8 习题
第58 章SOCKET:TCP/IP 网络基础
58.1 互联网
58.2 联网协议和层
58.3 数据链路层
58.4 网络层:IP
58.5 IP 地址
58.6 传输层
58.6.1 端口号
58.6.2 用户数据报协议(UDP)
58.6.3 传输控制协议(TCP)
58.7 请求注解(RFC)
58.8 总结
第59 章SOCKET:Internet Domain
59.1 Internet domain socket
59.2 网络字节序
59.3 数据表示
59.4 Internet socket 地址
59.5 主机和服务转换函数概述
59.6 inet_pton()和inet_ntop()函数
59.7 客户端/服务器示例(数据报socket)
59.8 域名系统(DNS)
59.9 /etc/services 文件
59.10 独立于协议的主机和服务转换
59.10.1 getaddrinfo()函数
59.10.2 释放addrinfo 列表:freeaddrinfo()
59.10.3 错误诊断:gai_strerror()
59.10.4 getnameinfo()函数
59.11 客户端/服务器示例(流式socket)
59.12 Internet domain socket 库
59.13 过时的主机和服务转换API
59.13.1 inet_aton()和inet_ntoa()函数
59.13.2 gethostbyname()和gethostbyaddr()函数
59.13.3 getserverbyname()和getserverbyport()函数
59.14 UNIX 与Internet domain socket 比较
59.15 更多信息
59.16 总结
59.17 习题
第60 章SOCKET:服务器设计
60.1 迭代型和并发型服务器
60.2 迭代型UDP echo 服务器
60.3 并发型TCP echo 服务器
60.4 并发型服务器的其他设计方案
60.5 inetd(Internet 超级服务器)守护进程
60.6 总结
60.7 练习
第61 章SOCKET:高级主题
61.1 流式套接字上的部分读和部分写
61.2 shutdown()系统调用
61.3 专用于套接字的I/O 系统调用:recv()和send()
61.4 sendfile()系统调用
61.5 获取套接字地址
61.6 深入探讨TCP 协议
61.6.1 TCP 报文的格式
61.6.2 TCP 序列号和确认机制
61.6.3 TCP 协议状态机以及状态迁移图
61.6.4 TCP 连接的建立
61.6.5 TCP 连接的终止
61.6.6 在TCP 套接字上调用shutdown()
61.6.7 TIME_WAIT 状态
61.7 监视套接字:netstat
61.8 使用tcpdump 来监视TCP 流量
61.9 套接字选项
61.10 SO_REUSEADDR 套接字选项
61.11 在accept()中继承标记和选项
61.12 TCP vs.UDP
61.13 高级功能
61.13.1 带外数据
61.13.2 sendmsg()和recvmsg()系统调用
61.13.3 传递文件描述符
61.13.4 接收发送端的凭据
61.13.5 顺序数据包套接字
61.13.6 SCTP 以及DCCP 传输层协议
61.14 总结
61.15 练习
第62 章终端
62.1 整体概览
62.2 获取和修改终端属性
62.3 stty 命令
62.4 终端特殊字符
62.5 终端标志
62.6 终端的I/O 模式
62.6.1 规范模式
62.6.2 非规范模式
62.6.3 加工模式、cbreak 模式以及原始模式
62.7 终端线速(比特率)
62.8 终端的行控制
62.9 终端窗口大小
62.10 终端标识
62.11 总结
62.12 练习
第63 章其他备选的I/O 模型
63.1 整体概览
63.1.1 水平触发和边缘触发
63.1.2 在备选的I/O 模型中采用非阻塞I/O
63.2 I/O 多路复用
63.2.1 select()系统调用
63.2.2 poll()系统调用
63.2.3 文件描述符何时就绪
63.2.4 比较select()和poll()
63.2.5 select()和poll()存在的问题
63.3 信号驱动I/O
63.3.1 何时发送“I/O 就绪”信号
63.3.2 优化信号驱动I/O 的使用
63.4 epoll 编程接口
63.4.1 创建epoll 实例:epoll_create()
63.4.2 修改epoll 的兴趣列表:epoll_ctl()
63.4.3 事件等待:epoll_wait()
63.4.4 深入探究epoll 的语义
63.4.5 epoll 同I/O 多路复用的性能对比
63.4.6 边缘触发通知
63.5 在信号和文件描述符上等待
63.5.1 pselect()系统调用
63.5.2 self-pipe 技巧
63.6 总结
63.7 练习
第64 章伪终端
64.1 整体概览
64.2 UNIX 98 伪终端
64.2.1 打开未使用的主设备:posix_openpt()
64.2.2 修改从设备属主和权限:grantpt()
64.2.3 解锁从设备:unlockpt()
64.2.4 获取从设备名称:ptsname()
64.3 打开主设备:ptyMasterOpen()
64.4 将进程连接到伪终端:ptyFork()
64.5 伪终端I/O
64.6 实现script(1)程序
64.7 终端属性和窗口大小
64.8 BSD 风格的伪终端
64.9 总结
64.10 练习
附录A 跟踪系统调用
附录B 解析命令行选项
附录C 对NULL 指针做转型
附录D 内核配置
附录E 更多信息源
附录F 部分习题解答
欢迎来到异步社区!
封底
Linux/UNIX 系统编程手册 (上册) [德]Michael Kerrisk 著 孙剑 许从年 董健 孙余强 译 Linux/UNIX 系统编程手册 (上册) 本书是 Linux 和 UNIX 系统编程接口方面的权威指南,该接口几乎被 Linux 或 UNIX 系统上运行的所有应用所采用。 在这本权威巨著中,Linux 编程专家 Michael Kerrisk 针对掌握系统编程技艺所需的系统调用和库函数进行了巨细靡遗的描 述,并用清晰、完整的程序示例来补充完善其讲解。 本书囊括了 500 多个系统调用和库函数,外加 200 多个程序实例、88 张表格和 115 幅图片。你将学到如何: ■ 高效读写文件; ■ 使用 POSIX 线程编写多线程程序; ■ 使用信号、时钟和定时器; ■ 构建和使用共享库; ■ 创建进程并执行程序; ■ 编写安全的程序; ■ 使用管道、消息队列、共享内存以及信号量进行进程间通信; ■ 使用套接字 API 编写网络应用程序。 本书在涵盖大量 Linux 专有特性(比如,epoll、inotify、/proc 文件系统)的同时,对 UNIX 标准(POSIX.1- 2001/ SUSv3 以及 POSIX.1- 2008/SUSv4)也极为重视,这使得本书对于在其他 UNIX 平台下工作的程序员也同样极具价值。 本书是 Linux 和 UNIX 编程接口方面覆盖最为广泛全面的著作,注定将成为新的经典。 Michael Kerrisk(http://man7.org)具有 20 多年的 UNIX 系统使用和编程经验,所开设的 UNIX 系统编程周训课程更是不计其数。自 2004 年起,他开始维护手册页项目,该项目旨在生 成描述 Linux 内核以及 glibc 编程 API 的手册页。他已经撰写或与他人合著了 250 多篇手册页, 至今仍积极参与对 Linux 内核 / 用户空间接口的测试和设计评审工作。Michael 与家人居住在德 国慕尼黑。 美术编辑:王建国 读者可通过http://www.man7.org/tlpi下载本书中的 所有源代码,获知更多信息。 i I L n u x / U N X 系 统 编 程 手 册 ( 上 册 ) 分类建议: 计算机 / 操作系统 /Linux 人民邮电出版社网址:www.ptpress.com.cn 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权 FM32867Linux UNIX系统编程手册(上下册).indd 1-3 13-11-29 下午2:04
Linux/UNIX 系统编程手册 (上册) [德]Michael Kerrisk 著 孙剑 许从年 董健 孙余强 译 人 民 邮 电 出 版 社 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权 北 京 FM32867Linux UNIX系统编程手册(上下册).indd 4 13-11-29 下午2:04
异步社区电子书 感谢您购买异步社区电子书!异步社区已上架电子书 500 余种,社区还会经常发布福利信 息,对社区有贡献的读者赠送免费样书券、优惠码、积分等等,希望您在阅读过程中,把您的 阅读体验传递给我们,让我们了解读者心声,有问题我们会及时修正。 社区网址:http://www.epubit.com.cn/ 反馈邮箱:contact@epubit.com.cn 异步社区里有什么? 图书、电子书(半价电子书)、优秀作译者、访谈、技术会议播报、赠书活动、下载资源。 异步社区特色: 纸书、电子书同步上架、纸电捆绑超值优惠购买。 最新精品技术图书全网首发预售。 晒单有意外惊喜! 异步社区里可以做什么? 博客式写作发表文章,提交勘误赚取积分,积分兑换样书,写书评赢样书券等。 联系我们: 微博: @ 人邮异步社区 @ 人民邮电出版社 - 信息技术分社 微信公众号: 人邮 IT 书坊 异步社区 QQ 群:368449889   异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权
版权声明 Copyright © 2010 by Michael Kerrisk. Title of English-language original: The Linux Programming Interface, ISBN 978-1-59327-220-3, published by No Starch Press. Simplified Chinese-language edition copyright © 2014 by Posts and Telecom Press. All rights reserved. 本书中文简体字版由美国 No Starch 出版社授权人民邮电出版社出版。未经出版者书面许可,对本书任 何部分不得以任何方式复制或抄袭。 版权所有,侵权必究。 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权  著 [德] Michael Kerrisk 译 孙 剑 许从年 董 健 孙余强 郭光伟 陈 舸 责任编辑 傅道坤 责任印制 程彦红 杨林杰  人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京艺辉印刷有限公司印刷  开本:7871092 1/16 印张:76.25198.25 字数:1 618千字 2014年1月第1版 印数:1 – 3 500册 2014年1月北京第1次印刷 著作权合同登记号 图字:01-2010-3829号 定价:158.00元(上、下册) 读者服务热线:(010)81055410 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京崇工商广字第0021号
内容提要 本书是介绍 Linux 与 UNIX 编程接口的权威著作。Linux 编程资深专家 Michael Kerrisk 在 书中详细描述了 Linux/UNIX 系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代 码示例。本书涵盖了逾 500 个系统调用及库函数,并给出逾 200 个程序示例,另含 88 张表格 和 115 幅示意图。 本书总共分为 64 章,主要讲解了高效读写文件,对信号、时钟和定时器的运用,创建进 程、执行程序,编写安全的应用程序,运用 POSIX 线程技术编写多线程程序,创建和使用共 享库,运用管道、消息队列、共享内存和信号量技术来进行进程间通信,以及运用套接字 API 编写网络应用等内容。 本书在汇聚大批 Linux 专有特性(epoll、inotify、/proc)的同时,还特意强化了对 UNIX 标准(POSIX、SUS)的论述,彻底达到了“鱼与熊掌,二者得兼”的效果,这也堪称本书的 最大亮点。 本书布局合理,论述清晰,说理透彻,尤其是作者对示例代码的构思巧妙,独具匠心, 仔细研读定会受益良多。本书适合从事 Linux/UNIX 系统开发、运维工作的技术人员阅读,同 时也可作为高校计算机专业学生的参考研习资料。 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权
献 辞 谨将本书献给 Cecilia,你照亮了我的世界! 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权
对本书的赞誉 编写 Linux 软件时如果只能选择一本参考书,则非本书莫属。 —MARTIN LANDERS,Google 公司软件工程师 本书描述精到,示例周详,涵盖了 Linux 底层 API 编程的详尽内容及个中细微之处—无 论读者水平如何,都能从本书中受益。 —MEL GORMAN,Understanding the Linux Virtual Memory Manager 作者 Michael Kerrisk 的这本 Linux 编程巨著,不但论及 Linux 编程、其与各种标准之间的联 系,而且还就作者所知,重点介绍了已获修正的 Linux 内核 bug 以及改进颇多的 Linux 手册 页。凭此三点,足可让 Linux 编程更易上手。本书对各项主题的深入探讨使其成为必备的参 考书籍—无论读者在 Linux 编程方面造诣如何。 —ANDREAS JAEGER,NOVELL 公司 OPENSUSE 项目经理 Michael 用他坚忍不拔的毅力为 Linux 程序员奉献了这本论述严谨、表述清晰、简洁的权 威参考书。虽然本书针对 Linux 程序员而著,但对任何在 UNIX/POSIX 环境中编程的程序员 来说都极具价值。 —DAVID BUTENHOF,Programming with POSIX Threads 作者、POSIX /UNIX 标准撰写者 本书在重点关注 Linux 系统的同时,对于 UNIX 系统和网络编程也阐述透彻,浅显易懂。 无论是初涉 UNIX 编程的新丁,还是编程经验丰富的 UNIX 老手(想要了解大行其道的 GNU/Linux 系统有何新意),我都向他们力荐此书。 —FERNANDO GONT,网络安全研究员、IETF 参与者、IETF RFC 作者 本书以百科全书般的叙述风格对 Linux 接口编程做了既深且广的覆盖,还提供了大量教 科书风格的编程示例和练习。本书所包含的各项主题—从原理到可以实际运行的代码— 都已描述清晰且易于理解。本书正是专业人士、学生以及教育工作者所期盼的 Linux/UNIX 参考书。 —ANTHONY ROBINS ,奥塔哥大学计算机科学副教授 无论从精确性、质量,还是详细程度来说,本书都令我印象深刻。身为 Linux 系统调用的 行家,Michael Kerrisk 与我们分享了他对 Linux API 的认知和理解。 —CHRISTOPHE BLAESS,Programmation système en C sous Linux 作者 1 Linux/UNIX 系统编程手册(上册) 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权
对于治学严谨的专业 Linux/UNIX 系统程序员而言,本书实为必备的参考书籍。本书涵盖 了所有关键 API 的使用,同时兼顾 Linux 和 UNIX 系统接口,描述清晰,示例具体;除此之 外,还强调了遵从诸如 SUS 和 POSIX 1003.1 等标准的重要性和益处。 —ANDREW JOSEY,The Open Group 标准部总监、POSIX 1003.1 工作组主席 由手册页的维护者亲自操刀,以系统程序员视角写出一本百科全书式的 Linux 系统编程巨 著,还有比这更完美的吗?本书全面而又详实。我坚信本书将在我的书架上牢牢占据一席之地。 —BILL GALLMEISTER,POSIX.4 Programmer’ s Guide: Programming for the Real World 作者 本书是最新最全的 Linux/UNIX 系统编程参考书。无论读者是 Linux 系统编程新兵,还是 关注 Linux 编程和程序移植性的 UNIX 系统编程老将,又或者只是在寻找一本 Linux 编程接口 方面的优秀参考书的读者,Michael Kerrisk 的这本大作都笃定是其案头良伴。 —LOÏC DOMAIGNÉ,CORPULS.COM 首席软件架构师(嵌入式) 图对本书的赞誉 2 异步社区会员 flyman150(2410757683@qq.com) 专享 尊重版权
分享到:
收藏