【Linux 系统编程】IPC 进程间通信全解:管道、有名管道与信号

📖 摘要 :本文系统梳理 Linux 进程间通信(IPC)三大传统手段------无名管道、有名管道、信号。全文适合系统编程初学者与面试复习者阅读。

🛠 实验环境:Ubuntu 22.04 / Linux 6.x,gcc 11,x86_64。


### 文章目录

  • [](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [@toc](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [〇、IPC 全景图:先见森林,再见树木 🗺](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [一、无名管道(anonymous pipe)🚇](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [1.1 定义与适用范围](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [1.2 操作流程与 API](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [1.3 代码实例 1:父子进程单向通信](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [1.4 管道的本质与四大特性](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [二、有名管道(FIFO)📮](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [2.1 定义](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [2.2 操作流程](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [2.3 代码实例 3:两个无关进程通过 FIFO 对话](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [2.4 无名 vs 有名管道对比表](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [三、信号(signal)🚦](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.1 概念](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.2 信号一览表(x86_64,`kill -l` 输出)](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.3 常用信号详解(含勘误)](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.4 信号的三种处理方式与注册](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.5 代码实例 4:注册 SIGINT(异步信号安全写法)](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.6 代码实例 5:sigaction 现代写法(推荐)](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒"](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [四、原笔记勘误与不严谨表述汇总 📌](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [五、高频面试题自测 ✅](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)
  • [六、结语 🏁](#文章目录 @[toc] 〇、IPC 全景图:先见森林,再见树木 🗺 一、无名管道(anonymous pipe)🚇 1.1 定义与适用范围 1.2 操作流程与 API 1.3 代码实例 1:父子进程单向通信 1.4 管道的本质与四大特性 1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④ 二、有名管道(FIFO)📮 2.1 定义 2.2 操作流程 2.3 代码实例 3:两个无关进程通过 FIFO 对话 2.4 无名 vs 有名管道对比表 三、信号(signal)🚦 3.1 概念 3.2 信号一览表(x86_64,kill -l 输出) 3.3 常用信号详解(含勘误) 3.4 信号的三种处理方式与注册 3.5 代码实例 4:注册 SIGINT(异步信号安全写法) 3.6 代码实例 5:sigaction 现代写法(推荐) 3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒" 四、原笔记勘误与不严谨表述汇总 📌 五、高频面试题自测 ✅ 六、结语 🏁)

〇、IPC 全景图:先见森林,再见树木 🗺

IPC(Inter-Process Communication,进程间通信) 是指不同进程之间传递数据或事件通知的机制。由于每个进程拥有独立的虚拟地址空间,进程间天然隔离,因此通信必须借助内核提供的桥梁。

原笔记将 IPC 分为三大类,整理如下表:

分类 代表机制 适用场景 备注
① 古老的通信方式 无名管道、有名管道、信号 同一主机 随 UNIX 诞生,POSIX 标准
② System V IPC 对象 共享内存★、消息队列、信号量集 同一主机 以 key 标识内核 IPC 对象;另有 POSIX IPC 一族(shm_open/mq_open/sem_open)应予补充
③ socket 通信 网络套接字、UNIX 域套接字 主要用于不同主机 🔧 原笔记只提"网络通信";注意 UNIX 域 socket 也可用于同一主机,且效率更高

💡 记忆口诀"管道传字节,信号传事件,共享内存传大块,socket 跨主机。"

text 复制代码
                ┌──────────────── 同一主机 ────────────────┐
                │  无名管道(亲缘)  有名管道(任意)  信号(通知) │
   进程 A ◄────►│  System V: 共享内存 / 消息队列 / 信号量集  │◄────► 进程 B
                │  POSIX:   shm / mq / sem                │
                └──────────────────────────────────────────┘
                ┌──────────────── 不同主机 ────────────────┐
   进程 A ◄────►│              socket(网络通信)            │◄────► 进程 B
                └──────────────────────────────────────────┘

一、无名管道(anonymous pipe)🚇

1.1 定义与适用范围

⚠️ 无名管道没有路径名 ,只能经由继承的文件描述符 访问,因此通常 用于亲缘进程(父子、兄弟)之间;但只要 fd 能被传递(如 fork() 继承、或经 UNIX 域 socket 的 SCM_RIGHTS ancillary message 传递),无亲缘关系的进程同样可以使用

有名管道 则相反:它在文件系统中有一个 FIFO 特殊文件节点 (有路径名),因此可以用于同一主机上任意进程间通信。

1.2 操作流程与 API

四步流程:

  1. 创建并打开管道:pipe()
  2. 读管道:read()
  3. 写管道:write()
  4. 关闭管道:close()
c 复制代码
int pipe(int pipefd[2]);
项目 说明
功能 创建并打开一个无名管道
参数 pipefd 出参,返回两个文件描述符:pipefd[0]读端pipefd[1]写端
返回值 成功 0;失败 -1,并置 errno

💡 助记"0 读 1 写"(0 对应 stdin 的"入",1 对应 stdout 的"出",与标准流方向一致)。

1.3 代码实例 1:父子进程单向通信

c 复制代码
/* pipe_basic.c
 * 编译: gcc pipe_basic.c -o pipe_basic
 * 运行: ./pipe_basic
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    int pipefd[2];
    pid_t pid;
    char buf[128];

    if (pipe(pipefd) == -1) {          /* fork 之前创建,子进程才能继承 */
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid < 0) { perror("fork"); exit(EXIT_FAILURE); }

    if (pid == 0) {                    /* ===== 子进程:写端 ===== */
        close(pipefd[0]);              /* 关键:关闭不用的读端 */
        const char *msg = "Hello, 我是子进程!";
        if (write(pipefd[1], msg, strlen(msg) + 1) == -1)
            perror("write");
        close(pipefd[1]);              /* 写完关闭,父进程 read 才能收到 EOF */
        exit(EXIT_SUCCESS);
    }

    /* ===== 父进程:读端 ===== */
    close(pipefd[1]);                  /* 关键:关闭不用的写端 */
    ssize_t n = read(pipefd[0], buf, sizeof(buf));
    if (n > 0)
        printf("父进程收到 %zd 字节: %s\n", n, buf);
    else if (n == 0)
        printf("管道已空且写端全部关闭 (EOF)\n");
    close(pipefd[0]);
    waitpid(pid, NULL, 0);             /* 回收子进程,防止僵尸 */
    return 0;
}

⚠️ 工程要点 :父子进程中"不用的那一端"必须关闭。这不仅是为了整洁------写端是否全部关闭直接决定读端能否返回 0(EOF),见 1.4 特性 ③。

1.4 管道的本质与四大特性

本质 :管道是内核中的一段缓冲区 (不是真实文件,只存在于内存),数据遵循 FIFO(先进先出) 字节流方式存取,无消息边界。

⚠️

概念 数值(x86_64 Linux) 含义
管道容量(capacity) 默认 65536 B(64K) 缓冲区总大小;Linux 2.6.11 起为 16 页;2.6.35 起可用 fcntl(fd, F_SETPIPE_SZ) 调整,上限见 /proc/sys/fs/pipe-max-size(默认 1MB),可用 F_GETPIPE_SZ 查询
PIPE_BUF(原子写上限) 4096 B ≤ PIPE_BUF 的写操作保证原子性(多进程写不会交错);超过则不保证原子

面试中"管道大小是多少"若只答 64K 而不提 PIPE_BUF,属于答了一半。

四大特性

# 特性 触发条件 表现
1 写阻塞 读写端都在,管道写满 write() 阻塞,直到有读者腾出空间
2 读阻塞 读写端都在,管道为空 read() 阻塞,直到有数据到来
3 读返回 0 写端全部关闭 先把残留数据读完, thereafter read() 不再阻塞,返回 0(等同文件 EOF)
4 管道破裂 读端全部关闭仍去写 内核向写进程发送 SIGPIPE ,默认动作是终止进程;write() 若返回则返回 -1,errno = EPIPE

1.5 代码实例 2:一条程序亲眼验证特性 ③ 与 ④

c 复制代码
/* pipe_flags_demo.c
 * 编译: gcc pipe_flags_demo.c -o pipe_flags_demo
 */
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    /* ---- 场景一:写端全部关闭 → 读返回 0 ---- */
    int p1[2];
    pipe(p1);
    if (fork() == 0) {
        close(p1[0]);
        write(p1[1], "EOF-DEMO", 8);
        close(p1[1]);          /* 子进程退出,写端消失 */
        _exit(0);
    }
    close(p1[1]);              /* 父进程只留读端 */
    char c;
    int n = 0, r;
    while ((r = read(p1[0], &c, 1)) > 0)
        n++;
    printf("[场景一] 读完 %d 字节残留数据后, read 返回 %d (EOF, 不再阻塞)\n", n, r);
    wait(NULL);

    /* ---- 场景二:无读端仍写 → SIGPIPE ---- */
    int p2[2];
    pipe(p2);
    pid_t pid = fork();
    if (pid == 0) {
        close(p2[0]);          /* 关闭读端,管道无读者 */
        write(p2[1], "x", 1);  /* 触发 SIGPIPE,进程被默认终止 */
        _exit(0);              /* 理论上走不到这里 */
    }
    close(p2[1]);
    int st;
    waitpid(pid, &st, 0);
    if (WIFSIGNALED(st))
        printf("[场景二] 子进程被信号 %d 终止 (13 = SIGPIPE, 管道破裂)\n",
               WTERMSIG(st));
    return 0;
}

预期输出:

text 复制代码
[场景一] 读完 8 字节残留数据后, read 返回 0 (EOF, 不再阻塞)
[场景二] 子进程被信号 13 终止 (13 = SIGPIPE, 管道破裂)

二、有名管道(FIFO)📮

2.1 定义

有名管道以特殊文件(FIFO 文件) 形式存在于文件系统中,ls -l 查看时文件类型位为 p。它解决了无名管道"必须亲缘"的限制:同一主机上任意两个进程,只要知道 FIFO 路径即可通信。

2.2 操作流程

五步流程:

  1. 创建有名管道文件:mkfifo()(或 shell 命令 mkfifo myfifo
  2. 打开管道文件:open()
  3. 写管道文件:write()
  4. 读管道文件:read()
  5. 关闭管道文件:close()
  6. 💡 补充 :不再使用时 unlink() 删除 FIFO 节点,避免残留。
c 复制代码
int mkfifo(const char *pathname, mode_t mode);   /* <sys/types.h> <sys/stat.h> */
/* 成功 0;失败 -1。若路径已存在 FIFO 则失败(errno=EEXIST),故常先 access() 判断 */

⚠️ open 的阻塞语义(高频考点) :以 O_RDONLY 打开 FIFO 会阻塞直到有进程以写方式打开 ;以 O_WRONLY 打开会阻塞直到有进程以读方式打开 。即"读写两端互相等待对方就位"。加 O_NONBLOCK 可解除:无读者时 O_WRONLY | O_NONBLOCK 直接失败返回 -1。

2.3 代码实例 3:两个无关进程通过 FIFO 对话

读端 fifo_read.c

c 复制代码
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>

#define FIFO_PATH "/tmp/my_fifo"

int main(void)
{
    if (access(FIFO_PATH, F_OK) == -1)            /* 不存在才创建 */
        if (mkfifo(FIFO_PATH, 0666) == -1) { perror("mkfifo"); return 1; }

    printf("读端: 等待写端打开...\n");
    int fd = open(FIFO_PATH, O_RDONLY);           /* 阻塞,直到写端 open */
    if (fd == -1) { perror("open"); return 1; }

    char buf[128];
    ssize_t n;
    while ((n = read(fd, buf, sizeof(buf))) > 0)  /* 写端全关后 read 返回 0 退出 */
        printf("读端收到 %zd 字节: %s\n", n, buf);

    close(fd);
    unlink(FIFO_PATH);                            /* 清理 FIFO 节点 */
    return 0;
}

写端 fifo_write.c

c 复制代码
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>

#define FIFO_PATH "/tmp/my_fifo"

int main(void)
{
    if (access(FIFO_PATH, F_OK) == -1)
        if (mkfifo(FIFO_PATH, 0666) == -1) { perror("mkfifo"); return 1; }

    printf("写端: 等待读端打开...\n");
    int fd = open(FIFO_PATH, O_WRONLY);           /* 阻塞,直到读端 open */
    if (fd == -1) { perror("open"); return 1; }

    const char *msg = "Hello, FIFO! 我们并无亲缘关系。";
    if (write(fd, msg, strlen(msg) + 1) == -1)
        perror("write");
    close(fd);
    return 0;
}
bash 复制代码
gcc fifo_read.c  -o fifo_read
gcc fifo_write.c -o fifo_write
./fifo_read &        # 先启动任一端均可,另一端 open 时互相等待
./fifo_write

2.4 无名 vs 有名管道对比表

维度 无名管道 pipe 有名管道 FIFO
文件系统节点 有(类型为 p
通信对象 通常亲缘进程 同主机任意进程
创建 API pipe() mkfifo() / 命令 mkfifo
打开语义 创建即得两端 fd open() 读写两端互相阻塞等待
生命周期 随进程 fd,进程退出即失效 节点持久存在,需 unlink 清理
数据流向 半双工(字节流) 半双工(字节流)

三、信号(signal)🚦

3.1 概念

信号是进程间的通知机制,不携带数据载荷,是一种异步通知机制 ,常被类比为"软中断"------它模拟了硬件中断的"打断---处理---恢复"模型,但完全由软件层面(内核)递送。

⚠️:

  1. sigqueue() 发送信号时可附带一个整型值union sigval),配合 SA_SIGINFO 的三参处理函数读取;
  2. 实时信号(SIGRTMIN~SIGRTMAX)支持排队 ,同一信号多次发送不会合并;而标准信号不排队(_pending 期间重复发送只记一次,故又称"不可靠信号")。

3.2 信号一览表(x86_64,kill -l 输出)

text 复制代码
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL  10) SIGUSR1
11) SIGSEGV  12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS  34) SIGRTMIN  ...  64) SIGRTMAX

⚠️ 表中 32、33 号"消失" 并非笔记笔误,而是 x86 Linux 上这两个编号被 NPTL 线程库内部占用 (glibc 用作 SIGCANCELSIGSETXID),因此 kill -l 显示的实时信号从 34 开始。读到此处不必怀疑表格,但应知其所以然。

3.3 常用信号详解(含勘误)

信号 编号 默认动作 典型产生方式与说明
SIGINT 2 终止 Ctrl+Cinterrupt 打断前台进程
SIGQUIT 3 终止+core Ctrl+\
SIGKILL 9 终止 强制杀死进程,不可捕获、不可忽略、不可阻塞
SIGSEGV 11 终止+core 段错误(非法内存访问)
SIGPIPE 13 终止 管道破裂:向无读端的管道写数据
SIGALRM 14 终止 定时器到时(alarm()/setitimer())。原笔记 ✅补充:可用 signal 捕获实现定时任务
SIGCHLD 17 忽略 ⚠️子进程终止、停止(stop)或恢复(continue) 时都会向父进程发送 SIGCHLD;默认动作是忽略。父进程常捕获它来及时 wait() 回收僵尸进程
SIGCONT 18 继续/忽略 让停止态进程继续执行
SIGSTOP 19 停止 强制暂停,不可捕获、不可忽略
SIGTSTP 20 停止 ⚠️ SIGTSTP 是来自终端的停止信号Ctrl+Z 触发,使进程进入停止态;它是可被捕获/忽略 的(区别于 SIGSTOP)。至于进程停止后是否转为后台运行,由作业控制命令 bg/fg 决定,与信号本身无关
SIGUSR1/2 10/12 终止 预留给程序员自定义使用的"用户信号",进程间轻量通知的常用选择

3.4 信号的三种处理方式与注册

处理方式 对应实参 语义
忽略 SIG_IGN 不处理(SIGKILL/SIGSTOP 除外)
缺省 SIG_DFL 按操作系统默认动作处理
捕获 自定义函数指针 信号到达时执行用户函数
c 复制代码
sighandler_t signal(int signum, sighandler_t handler);
项目 说明
功能 注册(设置)一个信号的处理方式
signum 要注册的信号编号
handler SIG_IGN / SIG_DFL / 自定义函数
返回值 ⚠️成功时返回该信号上一次 (注册之前)的处理函数指针(previous handler);失败返回 SIG_ERR。** 返回旧值是链式恢复旧行为的关键,切勿误解为返回刚传入的 handler

💡 进阶提示signal() 语义在不同 UNIX 历史版本中存在差异(早期 BSD 语义会在进入处理函数时重置为默认),可移植、严谨的生产代码应使用 sigaction()

3.5 代码实例 4:注册 SIGINT(异步信号安全写法)

c 复制代码
/* sig_catch.c
 * 编译: gcc sig_catch.c -o sig_catch
 * 运行后按 3 次 Ctrl+C 退出
 */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

static volatile sig_atomic_t g_cnt = 0;   /* volatile + sig_atomic_t 双保险 */

static void sig_handler(int signum)
{
    (void)signum;
    g_cnt++;               /* 处理函数内只做最简操作;printf 非异步信号安全 */
}

int main(void)
{
    sighandler_t old = signal(SIGINT, sig_handler);
    if (old == SIG_ERR) { perror("signal"); return 1; }

    /* 直观展示勘误⑧:old 是"旧"处理方式(首次为 SIG_DFL),而非新 handler */
    printf("PID=%d  旧handler=%p  新handler=%p\n",
           getpid(), (void *)old, (void *)sig_handler);
    printf("请按 Ctrl+C,按满 3 次自动退出\n");

    while (g_cnt < 3) {
        pause();           /* 挂起,等待任意信号唤醒 */
        printf("捕获到 SIGINT,累计 %d 次\n", g_cnt);
    }
    printf("正常退出\n");
    return 0;
}

⚠️ 严谨性说明 :信号处理函数运行在"异步上下文",只能安全地调用异步信号安全(async-signal-safe) 函数(如 write_exit),printf/malloc 均不在其列(若信号打断了同函数的执行,可能死锁或破坏状态)。上例采用"处理函数置标志位、主循环检查打印"的标准模式,这也是面试加分点。

3.6 代码实例 5:sigaction 现代写法(推荐)

c 复制代码
#include <signal.h>
#include <string.h>

struct sigaction sa;
sa.sa_handler = sig_handler;      /* 或 sa.sa_sigaction 三参版本 + SA_SIGINFO */
sigemptyset(&sa.sa_mask);         /* 处理期间不额外阻塞其他信号 */
sa.sa_flags = SA_RESTART;         /* 自动重启被信号打断的慢系统调用 */
if (sigaction(SIGINT, &sa, NULL) == -1) { perror("sigaction"); }

3.7 代码实例 6:父子进程用 SIGUSR1 "互传接力棒"

c 复制代码
/* sig_pingpong.c
 * 编译: gcc sig_pingpong.c -o sig_pingpong
 * 演示信号作为"事件通知"在进程间的使用
 */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

static volatile sig_atomic_t g_flag = 0;
static void on_usr1(int sig) { (void)sig; g_flag = 1; }

int main(void)
{
    pid_t pid = fork();
    if (pid == 0) {                          /* ===== 子进程 ===== */
        signal(SIGUSR1, on_usr1);
        kill(getppid(), SIGUSR1);            /* 先通知父进程:我已就绪 */
        for (int i = 0; i < 3; i++) {
            while (!g_flag) pause();
            g_flag = 0;
            printf("[子] 第 %d 次接到接力棒\n", i + 1);
            kill(getppid(), SIGUSR1);        /* 回传给父 */
        }
        _exit(0);
    }

    /* ===== 父进程 ===== */
    signal(SIGUSR1, on_usr1);
    while (!g_flag) pause();                 /* 等待子进程就绪,避免竞态 */
    g_flag = 0;
    for (int i = 0; i < 3; i++) {
        printf("[父] 第 %d 次发出接力棒\n", i + 1);
        kill(pid, SIGUSR1);
        while (!g_flag) pause();
        g_flag = 0;
    }
    waitpid(pid, NULL, 0);
    return 0;
}

💡 注意代码中"子进程先注册、再发就绪信号;父进程等就绪后才开始发棒 "的顺序------若父进程抢先 kill,子进程尚未注册捕获函数,SIGUSR1 的默认动作是终止进程,程序会莫名夭折。这类竞态是信号编程的典型坑。


四、原笔记勘误与不严谨表述汇总 📌

# 原笔记表述 性质 修正 / 严谨表述
"interprocess communicate" 英文标注不规范 Inter-Process Communication
无名管道"只能用在具有亲缘关系的进程间" 过于绝对 无路径名、靠继承 fd 访问,故通常用于亲缘进程;fd 可传递时非亲缘亦可
"默认 64K 字节"未区分概念 易误导 64K 是容量 (可用 F_SETPIPE_SZ 调整);PIPE_BUF=4096 才是原子写上限,二者不可混
信号"不携带数据" 不完整 标准信号不携带;sigqueue() 可附带整型值;实时信号支持排队
信号表 31 直接跳到 34 缺说明(非错) 32/33 被 NPTL 线程库占用(SIGCANCEL/SIGSETXID)
SIGCHLD "子进程结束时发送给父进程" 不完整 子进程终止/停止/恢复均产生;默认动作为忽略
SIGTSTP 解释混入"后台进程" 表述混乱 终端停止信号(Ctrl+Z),可捕获/忽略;前后台切换归作业控制(bg/fg)管
signal() 返回值"成功:handler" 错误 成功返回注册前的旧处理函数指针 ;失败返回 SIG_ERR

五、高频面试题自测 ✅

  1. 管道大小是多少?write() 一定原子吗?------答:容量默认 64K 可调;≤ PIPE_BUF(4096) 才保证原子。
  2. 读端全关后写管道会发生什么?------答:SIGPIPE,默认终止进程,errno=EPIPE
  3. signal() 的返回值是什么?------答:旧的处理方式。
  4. 哪两个信号不可捕获不可忽略?------答:SIGKILL、SIGSTOP。
  5. 如何避免僵尸进程?------答:捕获 SIGCHLD 后 wait/waitpid,或 signal(SIGCHLD, SIG_IGN)(POSIX 语义下由内核回收)。
  6. 有名管道 open() 为什么阻塞?------答:读写两端互相等待对方就位,O_NONBLOCK 可改变语义。

六、结语 🏁

管道解决"传字节",信号解决"传事件",二者与 System V/POSIX IPC、socket 一起构成了 Linux 进程协作的完整版图。学习 IPC 时,把每条特性都对应到一段可运行的代码上(如本文的六个实例),远比背诵表格牢固。

若本文对你的复习有帮助,欢迎点赞、收藏、评论三连 🙌 如有疏漏,评论区指正。

相关推荐
云絮.16 分钟前
网络原理 - UDP
服务器·网络·tcp/ip
xiaoye-duck21 分钟前
《Linux 网络编程》应用层自定义协议(一):序列化、sk_buff 与粘包半包处理
linux·网络
郭老师-嵌入式26 分钟前
arm linux 移植 udhcp 与 使用
linux·服务器·arm开发
代码终究输给规则27 分钟前
MATLAB r2026a 安装包和安装教程
linux·运维·服务器
临岸草惊风.28 分钟前
简单VASP计算INCAR设置(结构优化OPT、静态自洽SCF、能带BAND、态密度DOS)
linux·dft
z落落30 分钟前
C# WinForm TCP 服务器+WinForm TCP 客户端
服务器·tcp/ip·c#
牧码岛33 分钟前
阿里云服务器新端口上线SOP(Windows+Nginx+HTTPS)
服务器·nginx·阿里云
StarRocks_labs37 分钟前
StarRocks 4.1:聚焦生产实践,持续降低运维复杂度
运维·starrocks·iceberg·schema·物化视图·tablet·存算分离架构
钟良堂40 分钟前
Ubuntu 20.04 部署 ORB_SLAM3 完整流程与踩坑总结
linux·运维·ubuntu