System V IPC(3)-共享内存
一.概述
1.共享内存允许多个进程共享物理内存的同一块内存区。
2.与管道和消息队列不同,共享内存在用户内存空间,不需要内核介入。降低了内核和用户缓冲区的数据复制开销。所以这种IPC速度比较快。
3.多个进程共享内存时需要其他同步机制来控制临界区,如上一篇的信号量
二.函数接口
1.创建或打开共享内存
#include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);
key和shmflg同消息队列和信号量一样,这里不再叙述。
size:需要分配内存的大小
2.使用共享内存
#include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid:shmget()返回的值
shmaddr:把刚刚创建的内存指向该指针。如果是NULL,内核会自动选择。
shmflg:如果shmaddr不为NULL,shmflg控制shmaddr如果指向内存。如内存只读,计算内存地址倍数等,可以查看man手册。
3.分离共享内存
#include <sys/shm.h> int shmdt(const void *shmaddr);
shmaddr是该进程指向共享内存的指针。把该共享内存从该进程分离,即该共享内存和该进程没有联系了。分离后,共存内存依然存在。
4.控制共享内存
#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd和消息队列一样,IPC_RMID是删除共享内存。
三.简单例子
我们写2个小程序,第一个创建和拷贝数据到共享内存,第二个读取共享内存数据并删除共享内存。
1.创建和拷贝
/**
* @file shm1.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#define SHARE_MEM_BUF_SIZE 1024
void err_exit(const char *err_msg)
{
printf("error:%s\n", err_msg);
exit();
}
int main(void)
{
int shm_id;
void *share_mem;
";
shm_id = shmget(IPC_PRIVATE, SHARE_MEM_BUF_SIZE, | IPC_CREAT);
)
err_exit("shmget()");
printf("shm_id:%d\n", shm_id);
/* 把创建的共享内存指向该程序的一个指针 */
share_mem = shmat(shm_id, NULL, );
)
err_exit("shmat()");
/* 拷贝数据到共享内存 */
memcpy((char *)share_mem, text, strlen(text));
/* 分离共享内存 */
)
err_exit("shmdt()");
;
}
2.读取并删除
/**
* @file shm2.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#define SHARE_MEM_BUF_SIZE 1024
void err_exit(const char *err_msg)
{
printf("error:%s\n", err_msg);
exit();
}
int main(int argc, const char *argv[])
{
)
{
printf(]);
exit();
}
void *share_mem;
]);
/* 把创建的共享内存指向该程序的一个指针 */
share_mem = shmat(shm_id, NULL, );
)
err_exit("shmat()");
/* 读取数据 */
printf("read data:%s\n", (char *)share_mem);
/* 分离共享内存 */
)
err_exit("shmdt()");
/* 删除共享内存 */
) == -)
err_exit("shmctl()");
;
}
四.实验
1.shm1.c用IPC_PRIVATE方式让内核自动创建一个key,并分配1024字节内存。第36行把"123456"拷贝到共享内存。
2.shm2.c从命令行来指定要使用的共享内存,第35行读取数据,第42行删除数据。
3.运行shm1后,可以得到共享内存的shmid,可以用ipcs -m | grep 'xxx'查看:

可以看到我们分配的1024字节内存。
4.运行shm2接收shmid=50954258的数据并删除共享内存,再用ipcs -m | grep 'xxx'查看:

可以看到读取了"123456"数据,用ipcs查看时,已被删除。
System V IPC(3)-共享内存的更多相关文章
- System V IPC 之共享内存
IPC 是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 ...
- 五十、进程间通信——System V IPC 之共享内存
50.1 共享内存 50.1.1 共享内存的概念 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间.所有用户空间的进程若要操作共享内存,都要将其映射到自己 ...
- System V IPC 之信号量
本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...
- 进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...
- 第3章 System V IPC
3.1 概述 System V IPC 包含:System V消息队列.System V信号量.System V共享内存. 3.2 key_t 键和 ftok函数 这三种类型的System V IPC ...
- 《Unix网络编程》卷2 读书笔记 第3章- System V IPC
1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...
- 从并发处理谈PHP进程间通信(二)System V IPC
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- System V IPC 之消息队列
消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...
- 四十九、进程间通信——System V IPC 之消息队列
49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...
随机推荐
- JavaScript学习(3):函数式编程
在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...
- 使用 jQuery & CSS3 实现优雅的手风琴效果
手风琴效果常用于切换显示一组内容,这种方式既可以节省网页空间又可以有动画效果.今天,我们将创造一个优雅的手风琴内容效果.这个想法是有悬停时滑出一些垂直手风琴标签.我们将添加一些 CSS3 属性来提升外 ...
- 优秀工具推荐:两款很棒的 HTML5 游戏开发工具
HTML5 众多强大特性让我们不需要多么高深技术就能创建好玩的网页游戏,同时证明了开放的 Web 技术能与任何其他在游戏开发中使用的技术竞争.正如标题所说,这篇文章推荐的几款很棒 HTML5 游戏开发 ...
- Vue.js——60分钟快速入门
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...
- PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
PHP 后台定时循环刷新某个页面 如果间隔时间过长的话 会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...
- sass菜鸟教程
1.安装sass 在安装sass前需要安装ruby,下载ruby时要注意自己电脑是32位还是64位,下载好正常安装,但注意一下:要勾选下图这一项,添加环境变量(安装过JDK的朋友应该知道环境变量) 下 ...
- SAP 录屏BDC使用—实例
1) 输入TCode:SHDB进入BDC录制初始界面,该界面可以实现已创建BDC Session信息的查看.删除及锁定等操作 2) 单击工具栏 Newrecording 按钮创建一个新的BDC,系 ...
- sharepoint custom web service
创建自定义 ASP.NET Web 服务 http://msdn.microsoft.com/zh-cn/library/ms464040.aspx
- Java Android HTTP实现总结
Java Android HTTP实现总结 Http(Hypertext Transfer Protocol)超文本传输协议,是一个基于请求/响应模式的无状态的协议,Http1.1版给出了持续连接的机 ...
- Git 撤销修改
Git 撤销修改 增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言,这个例子中是HEAD,实际上可以指定其他有效的提交名称. 如果参数是小写的-c, ...