C语言共享内存
时间:2022-07-22
本文章向大家介绍C语言共享内存,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。
参考资料:
共享内存特点
- 共享内存是进程间共享数据最快的方法 一个进程向共享内存写入数据,共享这个内存区域的所有进程就可以立即看到其中的内容。
- 使用共享内存需要注意的是多进程之间对一个给定存储区访问的互斥 若一个进程正在向共享区写数据,则在它操作完成之前,其他的进程不应当去读、写这些数据。
示例代码如下
memShareWrite.c
//
// IPC--共享内存(写数据)
// Created by 卢鹏 on 2017/8/31.
//
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
// 共享内存大小
#define BUFFSIZE 1024
int main(int argc, char *argv[]) {
// 共享内存的shmid
int shmid;
// 共享内存的key
key_t key;
char *shmadd;
char *msg;
// 创建共享内存的key
if ((key = ftok("./", 2015)) == -1) {
perror("ftok error");
}
// 创建共享内存
if ((shmid = shmget(key, BUFFSIZE, IPC_CREAT|0666)) < 0) {
perror("shmget error.");
exit(-1);
}
printf("Create shared-memory success, with shmid: %dn", shmid);
// 映射
if ((shmadd = shmat(shmid, NULL, 0)) < 0) {
perror("shmat error.");
exit(-1);
}
// 拷贝共享数据到共享内存
printf("copy data to shared-memoryn");
bzero(shmadd, BUFFSIZE);
msg = "hello, yj.";
strcpy(shmadd, msg);
printf("copy data to shared-memory success, with msg: %sn", msg);
}
memShareRead.c
//
// IPC--共享内存(读数据)
// Created by 卢鹏 on 2017/8/31.
//
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 1024
int main(int args, char *argv[]) {
int shmid;
int ret;
key_t key;
char *shmadd;
// 创建key值
if ((key = ftok("./", 2015)) == -1) {
perror("ftok error.");
}
// 查看系统共享内存
printf("start-ipcs------------------------------------------n");
system("ipcs -m");
printf("end-ipcs--------------------------------------------n");
// 打开共享内存
if ((shmid = shmget(key, BUFFSIZE, IPC_CREAT|0666)) < 0) {
perror("shmget error.");
exit(-1);
}
printf("Open shared-memory success, with shmid: %dn", shmid);
// 映射
if ((shmadd = shmat(shmid, NULL, 0)) < 0) {
perror("shmat error.");
exit(-1);
}
// 读取共享内存中的数据
printf("read data from shared-memoryn");
printf("%sn", shmadd);
// 分离共享内存和当前进程
if ((ret = shmdt(shmadd)) < 0) {
perror("shmdt error.");
exit(1);
} else {
printf("Delete shared-memoryn");
}
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
// 查看系统共享内存
printf("start-ipcs------------------------------------------n");
system("ipcs -m");
printf("end-ipcs--------------------------------------------n");
return 0;
}
运行结果
➜ gcc memShareWrite.c -o w
➜ gcc memShareRead.c -o w
➜ chmod +x w
➜ chmod +x r
➜
➜
➜ ./w
Create shared-memory success, with shmid: 327680
copy data to shared-memory
copy data to shared-memory success, with msg: hello, yj.
➜
➜
➜ ./r
start-ipcs------------------------------------------
IPC status from <running system> as of Fri Sep 1 11:03:18 CST 2017
T ID KEY MODE OWNER GROUP
Shared Memory:
m 327680 0xdf041eec --rw-rw-rw- lpe234 staff
end-ipcs--------------------------------------------
Open shared-memory success, with shmid: 327680
read data from shared-memory
hello, yj.
Delete shared-memory
start-ipcs------------------------------------------
IPC status from <running system> as of Fri Sep 1 11:03:18 CST 2017
T ID KEY MODE OWNER GROUP
Shared Memory:
end-ipcs--------------------------------------------
最后
但在实际编程中,应该使用信号量,或通过传递消息(使用管道或IPC消息),或生成信号的方法来提供读写之间的更有效的同步机制。
- Android启动过程分析
- 单例模式
- 快速、直接的XSS漏洞检测爬虫 – XSScrapy
- 希尔排序
- RxJava2 实战知识梳理(3) - 优化搜索联想功能
- ubuntu上安装Apache2+ModSecurity及自定义WAF规则
- C++中关于指针初始化和使用NULL的理解
- ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示(优化篇)
- (虚)继承类的内存占用大小
- Linux服务器数据定期同步和备份方式
- Android组件化搭建
- ECMAScript 6 入门简介
- RxJava2 实战知识梳理(2) - 计算一段时间内数据的平均值
- 用了Docker,妈妈再也不担心我的软件安装了 - 基础篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mysql事务隔离级别详解和实战
- ELK+FileBeat+Kafka分布式系统搭建图文教程
- Flink CEP 原理和案例详解
- 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!
- 分布式计算框架Gearman原理详解
- 【从0开始の全记录】Flume+Kafka+Spark+Spring Boot 统计网页访问量项目
- 系统级性能分析工具perf的介绍与使用[转]
- 深入理解排序算法
- 用nginx缓存静态文件
- 优雅的玩PHP多进程
- 聊一聊mycat数据库集群系列之双主双重实现
- Fast-SCNN的解释以及使用Tensorflow 2.0的实现
- 基于Spring Boot快速实现发送邮件功能
- 史上最全的vim快捷键文档/手册/大全/帮助/指南
- RPC详解