思维导图备注

Linux环境编程:从应用到内核
首页 收藏书籍 阅读记录
  • 书签 我的书签
  • 添加书签 添加书签 移除书签 移除书签

7.1 线程与进程

浏览 6 扫码
  • 小字体
  • 中字体
  • 大字体
2022-01-24 09:57:53
请 登录 再阅读
上一篇:
下一篇:
  • 书签
  • 添加书签 移除书签
  • 前言
    • 0.1 一个Linux程序的诞生记
      • 0.4.2 C库函数
      • 0.4.3 线程安全
      • 0.4.4 原子性
      • 0.4.5 可重入函数
      • 0.4.6 阻塞与非阻塞
      • 0.4.7 同步与非同步
  • 第1章 文件I/O
    • 1.1 Linux中的文件
      • 1.1.2 内核文件表的实现
    • 1.2 打开文件
      • 1.2.2 更多选项
      • 1.2.3 open源码跟踪
      • 1.2.4 如何选择文件描述符
      • 1.2.5 文件描述符fd与文件管理结构file
    • 1.3 creat简介
    • 1.4 关闭文件
      • 1.4.2 close源码跟踪
      • 1.4.3 自定义files_operations
      • 1.4.4 遗忘close造成的问题
      • 1.4.5 如何查找文件资源泄漏
    • 1.5 文件偏移
      • 1.5.2 小心lseek的返回值
      • 1.5.3 lseek源码分析
    • 1.6 读取文件
      • 1.6.1 read源码跟踪
      • 1.6.2 部分读取
    • 1.7 写入文件
      • 1.7.1 write源码跟踪
      • 1.7.2 追加写的实现
    • 1.8 文件的原子读写
    • 1.9 文件描述符的复制
    • 1.10 文件数据的同步
    • 1.11 文件的元数据
      • 1.11.2 内核如何维护文件的元数据
      • 1.11.3 权限位解析
    • 1.12 文件截断
      • 1.12.3 为什么需要文件截断
  • 第2章 标准I/O库
    • 2.2 I/O缓存引出的趣题
    • 2.3 fopen和open标志位对比
    • 2.4 fdopen与fileno
    • 2.5 同时读写的痛苦
    • 2.6 ferror的返回值
    • 2.7 clearerr的用途
    • 2.8 小心fgetc和getc
    • 2.9 注意fread和fwrite的返回值
    • 2.10 创建临时文件
  • 第3章 进程环境
    • 3.1 main是C程序的开始吗
    • 3.2 “活雷锋”exit
    • 3.3 atexit介绍
      • 3.3.2 atexit的局限性
      • 3.3.3 atexit的实现机制
    • 3.4 小心使用环境变量
    • 3.5 使用动态库
      • 3.5.2 编译生成和使用动态库
    • 3.5.3 程序的“平滑无缝”升级
    • 3.6.2 如何防止内存越界
      • 3.7.1 setjmp与longjmp的使用
      • 3.7.2 “长跳转”的实现机制
      • 3.7.3 “长跳转”的陷阱
  • 第4章 进程控制:进程的一生
    • 4.2 进程的层次
      • 4.2.1 进程组
      • 4.2.2 会话
    • 4.3 进程的创建之fork()
      • 4.3.1 fork之后父子进程的内存关系
      • 4.3.2 fork之后父子进程与文件的关系
      • 4.3.3 文件描述符复制的内核实现
    • 4.4 进程的创建之vfork()
    • 4.5 daemon进程的创建
    • 4.6 进程的终止
      • 4.6.1 _exit函数
      • 4.6.2 exit函数
    • 4.6.3 return退出
      • 4.7.2 等待子进程之wait()
      • 4.7.3 等待子进程之waitpid()
      • 4.7.4 等待子进程之等待状态值
      • 4.7.5 等待子进程之waitid()
      • 4.7.6 进程退出和等待的内核实现
    • 4.8 exec家族
      • 4.8.2 exec家族
      • 4.8.3 execve系统调用的内核实现
      • 4.8.4 exec与信号
      • 4.8.5 执行exec之后进程继承的属性
    • 4.9 system函数
      • 4.9.2 system函数与信号
    • 4.10 总结
  • 第5章 进程控制:状态、调度和优先级
    • 5.1.1 进程状态概述
    • 5.1.2 观察进程状态
    • 5.3 普通进程的优先级
      • 5.4.1 时间片和虚拟运行时间
      • 5.4.2 周期性调度任务
      • 5.4.3 新进程的加入
    • 5.4.5 唤醒抢占
    • 5.6 实时进程
      • 5.6.1 实时调度策略和优先级
      • 5.6.2 实时调度相关API
      • 5.6.3 限制实时进程运行时间
    • 5.7 CPU的亲和力
  • 第6章 信号
    • 6.1 信号的完整生命周期
    • 6.2 信号的产生
    • 6.3 信号的默认处理函数
    • 6.4 信号的分类
      • 6.5.2 信号执行时屏蔽自身的特性
    • 6.5.3 信号中断系统调用的重启特性
      • 6.6.1 信号的可靠性实验
    • 6.6.2 信号可靠性差异的根源
    • 6.8 信号的发送
    • 6.9 信号与线程的关系
      • 6.9.2 线程有独立的阻塞信号掩码
      • 6.9.3 私有挂起信号和共享挂起信号
      • 6.9.4 致命信号下,进程组全体退出
    • 6.10 等待信号
      • 6.10.2 sigsuspend函数
      • 6.10.3 sigwait函数和sigwaitinfo函数
    • 6.11 通过文件描述符来获取信号
    • 6.12 信号递送的顺序
    • 6.14 总结
  • 第7章 理解Linux线程(1)
    • 7.1 线程与进程
    • 7.2 进程ID和线程ID
    • 7.3 pthread库接口介绍
    • 7.4 线程的创建和标识
      • 7.4.1 pthread_create函数
      • 7.4.2 线程ID及进程地址空间布局
      • 7.4.3 线程创建的默认属性
    • 7.5 线程的退出
    • 7.6 线程的连接与分离
      • 7.6.2 为什么要连接退出的线程
      • 7.6.3 线程的分离
    • 7.7 互斥量
      • 7.7.2 互斥量的接口
      • 7.7.3 临界区的大小
      • 7.7.4 互斥量的性能
      • 7.7.5 互斥锁的公平性
      • 7.7.6 互斥锁的类型
    • 7.8 读写锁
      • 7.8.1 读写锁的接口
      • 7.8.2 读写锁的竞争策略
      • 7.8.3 读写锁总结
    • 7.9 性能杀手:伪共享
      • 7.10.1 条件变量的创建和销毁
      • 7.10.2 条件变量的使用
  • 第8章 理解Linux线程(2)
    • 8.1.1 函数取消接口
    • 8.2 线程局部存储
      • 8.2.2 使用__thread关键字实现线程局部存储
    • 8.3 线程与信号
      • 8.3.2 向线程发送信号
      • 8.3.3 多线程程序对信号的处理
    • 8.4 多线程与fork()
  • 第9章 进程间通信:管道
    • 9.1 管道
      • 9.1.2 管道接口
      • 9.1.4 管道对应的内存区大小
      • 9.1.5 shell管道的实现
      • 9.1.6 与shell命令进行通信(popen)
    • 9.2 命名管道FIFO
      • 9.2.1 创建FIFO文件
      • 9.2.2 打开FIFO文件
    • 9.3 读写管道文件
  • 9.4 使用管道通信的示例
    • 10.1 System V IPC概述
      • 10.1.1 标识符与IPC Key
      • 10.1.2 IPC的公共数据结构
    • 10.2 System V消息队列
      • 10.2.1 创建或打开一个消息队列
      • 10.2.2 发送消息
      • 10.2.4 控制消息队列
    • 10.3 System V信号量
      • 10.3.3 操作信号量
      • 10.3.4 信号量撤销值
      • 10.3.5 控制信号量
    • 10.4 System V共享内存
      • 10.4.2 创建或打开共享内存
      • 10.4.4 分离共享内存
      • 10.4.5 控制共享内存
  • 第11章 进程间通信:POSIX IPC
    • 11.1 POSIX IPC概述
      • 11.1.1 IPC对象的名字
      • 11.1.2 创建或打开IPC对象
      • 11.1.3 关闭和删除IPC对象
      • 11.1.4 其他
    • 11.2 POSIX消息队列
      • 11.2.1 消息队列的创建、打开、关闭及删除
      • 11.2.2 消息队列的属性
      • 11.2.3 消息的发送和接收
      • 11.2.4 消息的通知
      • 11.2.5 I/O多路复用监控消息队列
    • 11.3 POSIX信号量
      • 11.3.2 信号量的使用
      • 11.3.3 无名信号量的创建和销毁
      • 11.3.4 信号量与futex
    • 11.4 内存映射mmap
      • 11.4.1 内存映射概述
      • 11.4.2 内存映射的相关接口
      • 11.4.3 共享文件映射
      • 11.4.5 共享匿名映射
      • 11.4.6 私有匿名映射
    • 11.5 POSIX共享内存
      • 11.5.1 共享内存的创建、使用和删除
  • 11.5.2 共享内存与tmpfs
    • 12.1 socket文件描述符
    • 12.2 绑定IP地址
      • 12.2.1 bind的使用
    • 12.3 客户端连接过程
      • 12.3.2 connect的源码分析
    • 12.4 服务器端连接过程
      • 12.4.2 listen的源码分析
      • 12.4.3 accept的使用
      • 12.4.4 accept的源码分析
    • 12.5 TCP三次握手的实现分析
      • 12.5.1 SYN包的发送
      • 12.5.2 接收SYN包,发送SYN+ACK包
      • 12.5.3 接收SYN+ACK数据包
      • 12.5.4 接收ACK数据包,完成三次握手
  • 第13章 网络通信:数据报文的发送
    • 13.2 数据包从用户空间到内核空间的流程
    • 13.3 UDP数据包的发送流程
    • 13.4 TCP数据包的发送流程
    • 13.5 IP数据包的发送流程
      • 13.5.1 ip_send_skb源码分析
      • 13.5.2 ip_queue_xmit源码分析
    • 13.6 底层模块数据包的发送流程
  • 第14章 网络通信:数据报文的接收
    • 14.2 数据包从内核空间到用户空间的流程
    • 14.3 UDP数据包的接收流程
    • 14.5 TCP套接字的三个接收队列
    • 14.6 从网卡到套接字
      • 14.6.1 从硬中断到软中断
      • 14.6.2 软中断处理
      • 14.6.3 传递给协议栈流程
      • 14.6.4 IP协议处理流程
      • 14.6.5 大师的错误?原始套接字的接收
      • 14.6.6 注册传输层协议
  • 14.6.7 确定UDP套接字
    • 15.3 数组和指针
    • 15.4 再论数组首地址
    • 15.5 “神奇”的整数类型转换
    • 15.6 小心volatile的原子性误解
    • 15.7 有趣的问题:“x==x”何时为假?
    • 15.8 小心浮点陷阱
      • 15.8.2 两个特殊的浮点值
    • 15.9 Intel移位指令陷阱
暂无相关搜索结果!
    展开/收起文章目录

    二维码

    手机扫一扫,轻松掌上学

    《Linux环境编程:从应用到内核》电子书下载

    请下载您需要的格式的电子书,随时随地,享受学习的乐趣!
    EPUB 电子书

    书签列表

      阅读记录

      阅读进度: 0.00% ( 0/0 ) 重置阅读进度