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 引入了三种高级进程间通信机制 消息 ...
随机推荐
- C# Unicode编码
为了避免在浏览器中传输数据的时候出现中文乱码,我们可以将内容进行URL编码,当然也可以将内容进行UNICODE编码.将汉字进行UNICODE编码,如:"王"编码后就成了" ...
- 《Continuous Integration》读书笔记
Trigger a Build whenever a change occurs. it can help us reduce assumptions on a projecvt by rebuild ...
- 验证:mysql AUTO_INCREMENT 默认值是1
用mongodb时,有些字段需要做自增,而且是用二十进制字母表示(使用a-t对应0-19),做了一个_auto_increment字段用来保存,但是应该从0开始还是从1开始呢? 和mysql保持一致便 ...
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
“猫叫.老鼠跑.主人醒”是一个很古老的话题了,大家也都有各自的想法和解决方案.我也是看了很多,一开始的时候是相当的迷糊,这个怎么就是面试题了?考的是啥呀,和编程有关系吗?又是猫又是老鼠的,晕死了.后来 ...
- ABAP 加密解密程序
用于对字符串的加密和解密: DATA: o_encryptor TYPE REF TO cl_hard_wired_encryptor, o_cx_encrypt_error TYPE REF TO ...
- NMAP实用手册
nmap在网络和渗透中使用相当频繁,相关教程也层出不穷.在此,我只整理出最实用的,言简意赅,方便自己,方便他人. 一.nmap介绍 NMAP,也就是Network Mapper,最早是Linux下的网 ...
- android listview多视图嵌套多视图
笔记,listview视图总结 public class HomeEduMoreAdapter extends BaseAdapter { private final String TAG = &qu ...
- [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3709957.html 之前写过一篇博客,是使用Fragment来实现T ...
- 线程安全、数据同步之 synchronized 与 Lock
本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...
- NDK-JNI实战教程(二) JNI官方中文资料
声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...