news 2026/4/29 10:49:03

【Linux】零基础学习命名管道-共享内存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】零基础学习命名管道-共享内存

【Linux】零基础学习命名管道与共享内存
(2025–2026 年仍然最实用的两种经典进程间通信方式)

命名管道(FIFO)和共享内存(Shared Memory)是 Linux 中最基础、最常用的两种IPC(进程间通信)方式,但它们的适用场景、性能、复杂度、使用难度差异非常大。

下面用最直白的语言 + 对比 + 代码 + 常见误区的方式帮你快速建立认知。

一、先看对比表(强烈建议先背熟这张表)

维度命名管道(FIFO / mkfifo)共享内存(shmget / shm_open)谁更常用(2025–2026 视角)
是否需要亲缘关系不需要不需要
数据是否需要拷贝需要(内核 → 用户 → 内核)不需要(直接映射到进程地址空间)共享内存完胜
传输方向单向(默认)或双向(开两个管道)双向(同一块内存谁都能读写)共享内存更灵活
是否有阻塞有(默认读写都会阻塞)无(除非自己加信号量/互斥锁)命名管道更“省心”
最大数据量通常 64KB 缓冲区(可调)理论上很大(受物理内存限制)共享内存容量更大
性能中等(系统调用 + 拷贝)极高(几乎只有内存访问)共享内存碾压
编程复杂度低(像普通文件读写)高(需要自己做同步、清理)命名管道对新手友好
典型场景简单日志传递、脚本间通信、父子进程高性能、大数据量、实时计算、数据库
是否跨机器否(同一台机器)否(同一台机器)

一句话总结选择依据:

  • 要简单、数据量小、不在意性能→ 用命名管道
  • 追求极致性能、数据量大、频繁读写→ 用共享内存(但要自己管同步)

二、命名管道(FIFO)——最容易上手的 IPC

创建方式(两种)

# 方法1:命令行创建(最常用)mkfifomyfifo# 方法2:C语言创建mkfifo("myfifo", 0666);

最经典的父子进程通信示例

// pipe_writer.c#include<stdio.h>#include<fcntl.h>#include<unistd.h>intmain(){intfd=open("myfifo",O_WRONLY);// 只写方式打开if(fd==-1){perror("open");return1;}char*msg="Hello from writer!\n";write(fd,msg,strlen(msg));close(fd);return0;}
// pipe_reader.c#include<stdio.h>#include<fcntl.h>#include<unistd.h>intmain(){intfd=open("myfifo",O_RDONLY);// 只读方式打开if(fd==-1){perror("open");return1;}charbuf[1024]={0};ssize_tn=read(fd,buf,sizeof(buf));printf("Received: %s",buf);close(fd);return0;}

关键行为

  1. 读端先打开 → 阻塞直到有写端打开
  2. 写端先打开 → 阻塞直到有读端打开
  3. 所有写端关闭后,读端 read() 返回 0(EOF)
  4. 管道缓冲区满时,写端阻塞

Shell 中最常见的用法(非常实用)

mkfifo/tmp/mypipe# 终端1(生产者)echo"data from terminal 1">/tmp/mypipe# 终端2(消费者)cat</tmp/mypipe

三、共享内存——性能之王,但最容易出错

两种主流方式(2025 年仍在并存)

方式API优点缺点推荐场景
System V 共享内存shmget / shmat / shmdt历史悠久,几乎所有系统支持API 古老,key 管理麻烦传统应用、老项目
POSIX 共享内存shm_open / mmap接口更现代,与文件类似需要手动 unlink新项目、推荐优先使用

POSIX 共享内存最简示例(强烈推荐写法)

writer.c

#include<stdio.h>#include<fcntl.h>#include<sys/mman.h>#include<unistd.h>#defineSHM_NAME"/my_shared_mem"#defineSHM_SIZE4096intmain(){intfd=shm_open(SHM_NAME,O_CREAT|O_RDWR,0666);if(fd==-1){perror("shm_open");return1;}ftruncate(fd,SHM_SIZE);char*ptr=mmap(0,SHM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(ptr==MAP_FAILED){perror("mmap");return1;}sprintf(ptr,"Hello from writer process! PID=%d",getpid());printf("Data written. Press Enter to exit...\n");getchar();munmap(ptr,SHM_SIZE);close(fd);shm_unlink(SHM_NAME);// 清理(重要!)return0;}

reader.c

#include<stdio.h>#include<fcntl.h>#include<sys/mman.h>#include<unistd.h>#defineSHM_NAME"/my_shared_mem"#defineSHM_SIZE4096intmain(){intfd=shm_open(SHM_NAME,O_RDONLY,0666);if(fd==-1){perror("shm_open");return1;}char*ptr=mmap(0,SHM_SIZE,PROT_READ,MAP_SHARED,fd,0);if(ptr==MAP_FAILED){perror("mmap");return1;}printf("Read from shared memory: %s\n",ptr);munmap(ptr,SHM_SIZE);close(fd);return0;}

四、零基础最容易踩的 8 个大坑(强烈建议收藏)

命名管道:

  1. 忘记创建 FIFO(直接 open 会失败)
  2. 一端关闭后另一端行为没预期(读到 EOF)
  3. 多个写端并发写 → 数据可能交错(无原子性)

共享内存:

  1. 忘记同步(读写冲突 → 数据错乱 / 撕裂)
  2. 忘记 shm_unlink → 重启程序后 shm_open 可能失败
  3. mmap 失败后没检查 MAP_FAILED
  4. 进程崩溃后共享内存没释放(用 ipcs -m 查看残留)
  5. System V 与 POSIX 混用导致 key 冲突

五、快速总结一句话口诀

  • 想简单、数据少、顺序读写→ 命名管道(像文件一样用)
  • 要速度、数据大、频繁交互→ 共享内存(但必须自己加锁/信号量)

你现在最想搞清楚哪一部分?

  • 命名管道的阻塞行为细节?
  • 如何在共享内存上加互斥锁/信号量?
  • System V 共享内存的写法对比?
  • 实际项目中怎么选(比如日志系统、实时数据处理)?
  • 想看一个带同步的完整共享内存例子?

告诉我你的具体困惑点,我可以继续展开。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 23:00:47

【网络安全】一个漏洞2w+,网安副业挖SRC漏洞,站着把钱挣了!

【网络安全】一个漏洞2w&#xff0c;网安副业挖SRC漏洞&#xff0c;站着把钱挣了&#xff01; 前言 一个漏洞奖励2w&#xff0c;这是真实的嘛&#xff01; UP入行网安这些年也一直在接私活&#xff0c;副业赚的钱几乎是我工资的三倍&#xff01;看到最近副业挖漏洞的内容非常…

作者头像 李华
网站建设 2026/4/19 16:30:37

如何黑掉一台根本不联网的电脑

一直以来&#xff0c;拿到一台电脑上的密钥&#xff0c;方法无非有以下三种&#xff1a; 1、直接拿到这台电脑&#xff0c;然后输入木马病毒进行盗取。&#xff08;此种略微LowB的方法风险在于&#xff1a;如果被电脑主人“捉奸在床”&#xff0c;愤而报警&#xff0c;则需要黑…

作者头像 李华
网站建设 2026/4/20 8:50:53

【Django毕设全套源码+文档】基于Django的蛋糕购物商城网站的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/20 8:50:51

《拆解Linux中的IP协议与数据链路层:地址、路由与分片的底层逻辑》

以下是针对《拆解Linux中的IP协议与数据链路层&#xff1a;地址、路由与分片的底层逻辑》这一主题的系统性拆解说明&#xff0c;尽量用清晰的层级和实际Linux视角来呈现。 核心对比表&#xff08;先建立整体认知&#xff09; 层级协议主要职责数据单元地址长度Linux中典型文件…

作者头像 李华
网站建设 2026/4/29 8:48:22

小尺寸PCB极细线路蚀刻均匀性标准

在高阶 HDI 小尺寸 PCB 量产中&#xff0c;线宽&#xff1c;30μm 的极细线路蚀刻均匀性&#xff0c;是决定产品良率与可靠性的核心瓶颈。小尺寸 PCB 板幅小、图形密度高&#xff0c;常规蚀刻工艺极易出现线宽偏差、侧蚀过度、残铜等问题&#xff0c;直接影响终端消费电子、医疗…

作者头像 李华