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消息),或生成信号的方法来提供读写之间的更有效的同步机制。
- vue获取DOM元素并设置属性
- koa2入门学习
- 记一个node实现的图形验证码从0到1
- FHQ Treap小结(神级数据结构!)
- vuex在页面中以对象展开运算符形式引入报错解决
- 手机网页调用相机拍照或者图库
- P1903 【模板】分块/带修改莫队(数颜色)
- 前端如何获取http状态码400的返回值
- 不确定行数的多行文本垂直水平居中的css
- Vue slot简单理解
- css实现图片横向排列滚动
- windows下nvm安装node之后npm命令找不到问题解决办法
- 元素加了position:absolute则该元素的text-align:center居中失效的解决办法
- Chrome设置断点的各种姿势
- 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 数组属性和方法
- Linux下批量修改服务器用户密码方法步骤
- Linux 常用文本处理命令和vim文本编辑器
- centos7利用yum安装lnmp的教程(linux+nginx+php7.1+mysql5.7)
- linux根据进程号PID查找启动程序的全路径
- linux服务器安装PHP扩展zip,zlib方法
- Lamp环境下设置绑定apache域名的方法分析
- Linux杀不死的进程之CPU使用率700%解决方法
- 解读Linux下ip命令展示的网络连接信息
- Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现
- Linux环境使用g++编译C++方法总结
- linux命令实现音频格式转换和拼接的方法
- Apache 解决80端口占用问题
- Centos7搭建主从DNS服务器的教程
- ubuntu 下JDK环境变量配置方法
- Linux部署msmtp+mutt发送邮件功能