ZeroOne AI
← 返回文章列表

Linux系统篇(二十三)——通信(一):什么是进程间通信?一文搞懂背景与全貌

👁 36
分类:工业互联网

通过实验揭示进程隔离的本质,系统梳理Linux进程间通信的六种机制:管道、消息队列、共享内存、信号量、信号与Socket,并给出选型方法。

项目背景

在 Linux 上写过多进程程序的开发者,迟早会撞上一个困惑:父进程和子进程明明是"一家人",为什么数据却传不过去?全局变量在子进程里改了,父进程读到的还是旧值?再往后,当需要多个进程协同完成一个任务——一个算 A 部分、一个算 B 部分,或者一个生产、一个消费——就会发现进程之间必须有某种"桥梁"来交换数据、协调节奏。这组桥梁,就是进程间通信(IPC)。

本文先把"进程间通信"这件事的整体面貌讲透:它是什么、为什么需要、有哪些方式、如何选型。至于每种方式的具体原理、API 与代码实战,会在后续文章中逐篇展开。

技术方案

实验:一个"注定失败"的全局变量通信

先做一个简单实验。写一段 C 代码,让子进程修改全局变量,父进程随后读取:

// why_ipc.c —— 用全局变量在父子进程间传数据,能成功吗?
#include <stdio.h>
#include <unistd.h>

int global_value = 100;   // 全局变量,子进程真的能共享吗?

int main(void) {
    pid_t pid = fork();

    if (pid == 0) {
        /* 子进程:修改全局变量 */
        global_value = 999;
        printf("Child  sees global_value = %d\n", global_value);
        return 0;
    } else {
        /* 父进程:稍等片刻再读 */
        sleep(1);
        printf("Parent sees global_value = %d\n", global_value);
    }
    return 0;
}

编译运行:

gcc -Wall -o why_ipc why_ipc.c && ./why_ipc

输出结果:

Child  sees global_value = 999
Parent sees global_value = 100

子进程明明把 global_value 改成了 999,父进程读到的却还是 100。原因在于 fork() 采用写时复制(COW,Copy-On-Write):子进程先与父进程共享同一份物理内存,一旦子进程试图修改,内核就为它复制一份独立的内存副本。从此父子进程各持一份 global_value,修改互不影响。

这正是进程隔离的核心:每个进程拥有独立的虚拟地址空间,进程 A 地址 0x1000 与进程 B 地址 0x1000 并不是同一块物理内存。这种隔离是安全性的根基——一个进程崩溃、被攻击或内存越界,都影响不到其他进程。但代价是进程之间无法直接交换数据,于是操作系统提供了一系列"桥",让进程在保持隔离的同时还能协作,这些"桥"统称为 IPC。

IPC 解决的两类问题

进程间通信(IPC,Inter-Process Communication)是操作系统提供的、在多个进程之间传输数据和交换信息的一组机制。它要解决的本质问题只有两类:

要解决的问题含义典型机制
传输数据把一份数据安全地从进程 A 送到进程 B管道、消息队列、共享内存、Socket
同步控制让多个进程在时间上协调配合,避免互相踩踏信号量、信号

进程协作不外乎两种模式:

实际工程中两者通常配合使用,经典组合是"共享内存传大块数据 + 信号量保证读写顺序"。

为什么不能用全局变量或共享文件

初学者常问:既然要共享数据,为什么不用全局变量,或者把数据写进一个公共文件?

  1. 全局变量在进程间是"假共享"。如实验所示,进程各有独立地址空间,全局变量在每个进程里都是独立副本,修改互不可见——这正是进程隔离要保证的;
  2. 共享文件问题很多:两个进程同时读写同一文件,会并发写互相覆盖(缺原子性);没有消息边界,不知道读到哪算一条完整数据;磁盘 IO 慢,性能极差;数据不落盘还要自己维护缓存。

IPC 机制正是操作系统专门设计的"带同步、带边界、高性能"的协作方案,比"开个文件互相读写"严谨得多。一句话:进程之间天然共享不了变量,只能通过操作系统提供的 IPC 通道交流。

系统架构

Linux 下的 IPC 机制经过数十年发展,形成了"两大体系 + 网络通信"的格局,可以归纳为一张全景表:

类别代表机制一句话概括通信模型
数据传输匿名管道 / 命名管道最古老的字节流管道单向、流式
数据传输消息队列有类型的消息块双向、按类型
共享存储共享内存最快的零拷贝共享直接读写
同步控制信号量计数器式同步原语互斥/同步
事件通知信号异步通知,只传编号单向、异步
网络通信Socket能力最全面的通道双向、可跨主机

六种机制一句话定位

  1. 管道(Pipe):像一根真实管子,一端写、一端读,数据先进先出。匿名管道只能父子进程使用,命名管道(FIFO)任何进程都能用,适合简单的流式数据传输;
  2. 消息队列(Message Queue):把数据打包成"有类型、有边界"的消息,接收方可以只取某一种类型的消息,天然适合任务分发。数据经过内核,性能中等;
  3. 共享内存(Shared Memory):把同一块物理内存映射到多个进程,大家直接读写,零拷贝、性能最高。但它不负责同步,必须搭配信号量使用;
  4. 信号量(Semaphore):一个计数器,专门用于同步——控制多进程互斥访问共享资源,或实现"我生产你消费"的协作关系,是共享内存的最佳搭档;
  5. 信号(Signal):异步事件通知,进程收到信号后打断当前工作去执行处理函数。只能传一个整数编号,传不了大块数据,适合做"提醒"和"唤醒";
  6. Socket:原本为网络设计,但本机进程也能用(Unix Domain Socket),还能跨主机通信(TCP/UDP)。能力最全面,是 Redis、Nginx 等高性能中间件本地通信的首选。

记忆口诀:小数据用管道,有类型用队列,大数据用共享内存,跨机器用 Socket,要同步找信号量,只提醒发信号。

实施过程

选型三步法

第一步:先看是否跨主机。跨主机只有 Socket(TCP/UDP)可选,其余机制全部出局。

第二步:再看数据量级:

第三步:最后看同步需求。凡是多个进程同时访问同一资源,都别忘了同步——共享内存 + 信号量是经典组合,Socket 则通常配合 IO 多路复用(epoll)。

场景速查表

场景推荐方案
父子进程传简单数据匿名管道
无亲缘进程传流式数据命名管道 FIFO
按类型分发任务消息队列
大块数据、极致性能共享内存 + 信号量
只做事件通知信号
本机高并发服务通信Unix Domain Socket
跨主机通信TCP / UDP Socket

应用价值

理解 IPC 的整体框架,价值体现在三方面:

SEO关键词

Linux,进程间通信,IPC,管道,消息队列,共享内存,信号量,信号,Socket,写时复制,进程隔离

推荐阅读

更多工业 AI、智能制造与技术实践文章

C#调用Intel NPU实现YOLOv26极速推理:OpenVINO工业视觉加速实践

通过C# + OpenVINO Runtime调用Intel Core Ultra NPU运行YOLOv26模型,实现低功耗、毫秒级的工业边缘AI视觉推理,涵盖模型导出、环境配置、推理代码与FP16/INT8/异步推理等性能优化实践。

C#工业视觉平台结合YOLOv26与OpenVINO

从数据标注、自动训练到Intel NPU边缘推理的完整工业AI方案:C#工业软件平台 + YOLOv26训练框架 + OpenVINO模型转换 + Intel NPU边缘推理,实现图像采集、自动标注、模型训练到现场推理的完整AI视觉闭环。

工业互联网

MY-BASIC 应用(一):轻量级嵌入式 BASIC 解析器介绍

MY-BASIC 是一个用标准 C 语言编写的轻量级 BASIC 解释器:不足 128KB 内存占用、可嵌入可扩展、支持原型编程与 Lambda 函数式编程、Unicode、列表/字典集合,适合嵌入式设备脚本化控制。

工业互联网

Linux系统篇(七)——工具篇(二):一篇搞懂 C 语言程序从代码到可执行文件的完整旅程

拆解 C 程序预处理、编译、汇编、链接四步变身流程,讲透条件编译与静态、动态链接差异,附分步实操与报错排查。

AI视觉

树莓派推送RTSP视频流实战:FFmpeg + rtsp-simple-server(MediaMTX)搭建局域网视频直播服务

本文面向树莓派视频流、Python视觉开发、RTSP视频监控和边缘AI视觉初学者,介绍如何在Raspberry Pi上搭建简单、稳定的RTSP视频流服务。项目采用FFmpeg + rtsp-simple-server(MediaMTX)方式,将树莓派摄像头采集的视频转换并推送到RTSP服务器,再由电脑、NVR、VLC、OpenCV或AI视觉程序访问。文章从安装FFmpeg并验证版本开始,下载适用于ARM64架构的MediaMTX v1.8.1,配置Linux Systemd服务实现RTSP服务器开机自启,最后将摄像头视频推送到RTSP地址,形成树莓派摄像头 → FFmpeg → RTSP服务器 → 客户端播放/AI检测的完整视频流架构。

AI视觉

YOLO目标检测模型调参入门:从训练参数到检测效果优化

YOLO目标检测模型调参入门指南:详解 epochs、imgsz、batch、模型大小、conf、IoU 等核心参数的作用与调节方法,给出工业视觉、疲劳驾驶、缺陷检测等 AI 项目的调参顺序与实验对比思路,帮助初学者在精度、速度与显存之间找到平衡。

评论(0)