news 2026/7/2 1:40:42

复习——共享内存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
复习——共享内存

共享内存

一、共享内存(Shared Memory)

1.1 基本概念

  • System V提供:UNIX操作系统的进程间通信方式

  • 特点:效率最高的IPC方式

1.2 操作流程

key → 申请对象 → 映射对象 → 读写对象 → 撤销映射 → 删除对象

1.3 与管道的区别

特性共享内存管道
读写权限双方都可读写半双工,固定读写端
阻塞无读写阻塞有读写阻塞
同步需搭配其他IPC(信号/信号量)自带同步
存储内存区域(字符数组)特殊文件
数据保留数据保持,需主动清除读取后剪切

1.4 相关函数接口

1.4.1 生成键值ftok()
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);

功能:通过路径和项目ID生成唯一键值
参数

  • pathname:任意存在且不常改变的文件路径

  • proj_id:项目ID(通常使用ASCII字符)
    返回值:成功返回键值,失败返回-1

1.4.2 申请共享内存shmget()
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);

功能:申请共享内存
参数

  • key:唯一键值

  • size:申请的内存大小

  • shmflg:权限标志

    • IPC_CREAT:创建(如果不存在)

    • IPC_EXCL:检测是否存在

    • 权限:八进制数(如0666
      返回值:成功返回shmid,失败返回-1

1.4.3 映射共享内存shmat()
void *shmat(int shmid, const void *shmaddr, int shmflg);

功能:将共享内存映射到进程地址空间
参数

  • shmid:共享内存ID

  • shmaddr:映射地址(通常为NULL,由系统分配)

  • shmflg:访问权限

    • 0:读写

    • SHM_RDONLY:只读
      返回值:成功返回映射地址,失败返回(void*)-1

1.4.4 读写共享内存
// 字符串操作 strcpy(shm_ptr, "Hello"); strcat(shm_ptr, " World"); // 内存操作 memcpy(shm_ptr, data, size); memset(shm_ptr, 0, size); memcmp(shm_ptr, data, size); // 直接赋值 *(int*)shm_ptr = 100;
1.4.5 撤销映射shmdt()
int shmdt(const void *shmaddr);

功能:断开共享内存映射
参数

  • shmaddr:映射地址
    返回值:成功返回0,失败返回-1

1.4.6 删除共享内存shmctl()
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

功能:控制共享内存
参数

  • shmid:共享内存ID

  • cmd:控制命令

    • IPC_RMID:删除共享内存

  • buf:通常为NULL
    返回值:成功返回0,失败返回-1

1.5 示例代码

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/types.h> #include <unistd.h> #define SHM_SIZE 1024 int main() { // 1. 生成键值 key_t key = ftok("/tmp", 'A'); if (key == -1) { perror("ftok"); exit(1); } // 2. 申请共享内存 int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); if (shmid == -1) { perror("shmget"); exit(1); } // 3. 映射共享内存 char *shm_ptr = (char*)shmat(shmid, NULL, 0); if (shm_ptr == (void*)-1) { perror("shmat"); exit(1); } // 4. 读写共享内存 sprintf(shm_ptr, "Hello from PID: %d", getpid()); printf("Write to shm: %s\n", shm_ptr); sleep(2); // 等待其他进程读取 // 5. 撤销映射 if (shmdt(shm_ptr) == -1) { perror("shmdt"); } // 6. 删除共享内存(通常由最后一个进程执行) if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl"); } return 0; }

1.6 命令工具

# 查看所有IPC对象 ipcs -a # 查看共享内存 ipcs -m # 删除共享内存 ipcrm -m shmid # 查看进程 ps aux | grep a.out

1.7 共享内存特性验证

  1. 数据存储方式:拷贝(不是剪切)

  2. 多次读写:会覆盖原有数据(无偏移时)

  3. 同步问题:需要配合其他IPC机制

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

ORACLE检查并创建表空间和表分区

为确保系统在高并发、大数据量环境下的稳定高效运行&#xff0c;要求建立完善的表空间与表分区管理机制&#xff0c;具体包括&#xff1a;定期检查表空间使用率&#xff0c;及时发现并处理空间不足风险&#xff1b;建立分区自动创建与维护流程&#xff0c;防止因分区缺失导致的…

作者头像 李华
网站建设 2026/7/1 4:40:57

港媒盛赞“香港媳妇”徐冬冬!婚照惊艳全网,港圈作品圈粉无数

12月18日&#xff0c;徐冬冬与尹子维的婚纱照强势空降热搜&#xff0c;甜酷兼具的造型让网友直呼美貌惊艳&#xff0c;气质独一份。从戏里媚骨天成的“大嫂”到戏外被港媒追捧的“香港媳妇”&#xff0c;这位东北大妞不仅用八年分合的爱情故事打动人心&#xff0c;更在港娱圈深…

作者头像 李华
网站建设 2026/6/30 2:01:50

Redis高级特性与生产环境部署

Redis高级特性与生产环境部署实践一、Redis核心数据类型深度解析1.1 哈希&#xff08;Hash&#xff09;类型详解1.1.1 哈希数据结构# 哈希结构示意图 key: "user:1001" value: {"name": "张三","age": 25,"city": "北京…

作者头像 李华
网站建设 2026/7/1 9:25:44

java计算机毕业设计网咖会员管理系统 电竞馆会员计费与点餐一体化平台 网吧会员上机充值及订单管理系统

计算机毕业设计网咖会员管理系统67kvh9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情后电竞消费井喷&#xff0c;传统网吧前台手工登记、纸质充值券、Excel对账的模式已无法…

作者头像 李华
网站建设 2026/7/1 7:28:42

springboot基于智能推荐的卫生健康系统(11544)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/7/1 22:59:14

(100分)- 表达式括号匹配(Java JS Python C)

(100分)- 表达式括号匹配&#xff08;Java & JS & Python & C&#xff09;题目描述(1(23)*(3(80))1-2)这是一个简单的数学表达式,今天不是计算它的值,而是比较它的括号匹配是否正确。前面这个式子可以简化为(()(()))这样的括号我们认为它是匹配正确的,而((())这样的…

作者头像 李华