一、原理

共享内存是三个IPC(Inter-Process Communication)机制中的一个。
它允许两个不相关的进程访问同一个逻辑内存。
共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式。
大多数的共享内存的实现,
都把由不同进程之间共享的内存安排为同一段物理内存。

共享内存是由IPC为进程创建一个特殊的地址范围,
它将出现在该进程的地址空间中。
其他进程可以将同一段共享内存连接它们自己的地址空间中。
所有进程都可以访问共享内存中的地址,
就好像它们是由malloc分配的一样。

如果某个进程向共享内存写入了数据,
所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。

共享内存本身没有同步机制,需要程序自己保证(有点类似全局变量的读写需要加锁)共享内存的优点是简易性。
使用消息队列时,一个进程要向队列中写入消息,这要引起从用户地址空间向内核地址空间的一次复制,同样一个进程进行消息读取时也要进行一次复制。共享内存的优点是完全省去了这些操作。
共享内存会映射到进程的虚拟地址空间,进程对其可以直接访问,避免了数据的复制过程。
因此,共享内存是GNU/Linux现在可用的最快速的IPC机制。

#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmdt(const void *shm_addr);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
1.shmget函数

用来创建共享内存

int shmget(key_t key, size_t size, int shmflg);

key:为共享内存段命名
size:以字节为单位的大小
shmflg:9bit的权限标志位

2.shmat函数

连接共享内存到进程地址空间

void *shmat(int shm_id, const void *shm_addr, int shmflg);

shm_id:shmget返回的共享内存ID
shm_addr:共享内存连接到当前进程空间的地址,通常为空指针,表示让系统来选择
shmflg:
SHM_RND:和shm_addr联合使用,用来控制连接当前进程空间的地址;
SHM_RDONLY:使连接的地址只读

3.shmdt函数

int shmdt(const void *shm_addr);
将共享内存从当前进程空间分离
shm_addr:shmat返回的地址

4.shmctl函数

int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
共享内存的控制函数

struct shmid_ds {uid_t shm_perm.uid;uid_t shm_perm.gid;mode_t shm_perm.mode;
}

cmd:有以下取值:
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段

/* readshm.c */
/* 读数据 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>#define BUF_SIZE 1024
#define MYKEY 25  int  main()
{    int shmid;    char * shmptr;    /* 获取共享内存ID */if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1)    {    printf("shmget error!\n");    return 1;    }    if((shmptr = shmat(shmid,0,0)) == (void *)-1)    {    printf("shmat error!\n");    return 1;    }    while(1)    {    printf("string :%s\n",shmptr);    /* 读共享内存数据 */   if (strcmp(shmptr, "quit") == 0){shmdt(shmptr);return 0; }sleep(5);    }    return 0;
}
writeshm.c
/* 写数据 */
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>#define BUF_SIZE 1024
#define MYKEY 25     int main()
{    int shmid;    char *shmptr;    /* 创建共享内存 */if((shmid = shmget(MYKEY,BUF_SIZE,IPC_CREAT)) ==-1){    printf("shmget error \n");    return 1;    }    /* 连接共享内存到进程地址空间 */if((shmptr =shmat(shmid,0,0))==(void *)-1)    {    printf("shmat error!\n");    return 1;    }    while(1)    {    printf("input:");    scanf("%s",shmptr);    /* 写共享内存数据 */if (strcmp(shmptr, "quit") == 0){//sleep(1);shmdt(shmptr);return 0; }}    return 0;
}

Makefile:


APP_READ = readshm
READ_OBJS = readshm.o
APP_WRITE = writeshm
WRITE_OBJS = writeshm.oCC = gcc
INC = ./
CFLAG += -g.PHONY : allall : $(APP_READ) $(APP_WRITE)$(APP_READ) : $(READ_OBJS)$(CC) $(CFLAG) $(READ_OBJS) -o $(APP_READ)$(APP_WRITE) : $(WRITE_OBJS)$(CC) $(CFLAG) $(WRITE_OBJS) -o $(APP_WRITE)%.o : %.c$(CC) -c $(CFLAG) $^ -o $@.PHONY : cleanclean :rm -f *.orm -f $(APP_READ) $(APP_WRITE)

参考 http://blog.csdn.net/zhaoyw2008/article/details/38787409

Linux 18 IPC之共享内存shm相关推荐

  1. 进程间通信(IPC)之内存映射mmap和共享内存shm

    一.共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快. 二.内存映射mmap 1 前言:先介绍一 ...

  2. Linux系统编程—进程间通信—共享内存

    Linux共享内存 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉 ...

  3. Linux基础入门--进程间通信--共享内存

    Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...

  4. 进程间通信IPC之--共享内存

    每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...

  5. 进程间通信之共享内存SHM

    文章目录 1. system-v IPC简介 2. 函数ftok()函数介绍 3. 共享内存SHM介绍 4. 共享内存SHM相关接口函数 5. 共享内存SHM代码示例 1. system-v IPC简 ...

  6. linux ipc shmget 例子,Linux IPC之共享内存C 事例(示例代码)

    简介 共享内存(shared memory)是最简单的Linux进程间通信方式之一.使用共享内存,不同进程可以对同一块内存进行读写.由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不需要进行 ...

  7. linux学习---基于内存的IPC(共享内存,信号量数组,消息队列)

    常用的IPC分为两个类别,一是基于文件,而是基于内存 基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件 如果要看基于文件的IPC,请参考:http://blog.csdn.net/ ...

  8. Linux——进程间通信(共享内存shm)笔记

    文章目录 前言 一.共享内存的通信原理 二.共享内存函数 1.共享内存实现步骤 2.函数的说明 1.shmget( )函数 2.shmat( )函数 3.shmdt( )函数 三.代码示例: 执行结果 ...

  9. 【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

    IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

最新文章

  1. Linux 静态库 动态库
  2. Rxjava+Retrofit+Mvp的使用实例(基于retrofit2.1.0)
  3. ps efgrep mysql 命令_mysql常用管理命令
  4. 海洋大数据关键技术及在灾害天气下船舶行为预测上的应用
  5. 万物皆可爬系列使用python爬阴阳师图片
  6. oracle19c 安装权限_redhat7.6Linux安装Oracle19C完整版教程
  7. 制作GHOST XP 基于自由天空驱动包+SysPacker 2.1
  8. YII学习笔记6.20日
  9. python嵌套列表输出_Python列表的增删改查排嵌套特殊输出格式
  10. 校园网设计超超超级详细的配置来了(以河北科技大学为例)
  11. 配置activity-alias别名,更改app图标和名字
  12. 【板栗糖GIS】GIS如何导出obj格式的建筑白膜数据
  13. 190825 reverse-ogeek初赛
  14. RL基础算法优缺点总结
  15. 每天学一点 mysql
  16. CDR排钻教程-CorelDRAW服装设计中的排钻技术
  17. dbz用connector入hana报错Invalid Java object for schema type INT64: class java.util.Long for field “null“
  18. Python2中使用input出现的NameError: name ‘***‘ is not defined问题原因及解决办法
  19. 上海房产税免征--积分或居住证
  20. ZEGO 2018上海音视频技术嘉年华 活动回顾PPT下载

热门文章

  1. VB读写EXCEL的小技巧
  2. FMS代码实现PULL STREAM
  3. 【汇智学堂】-python小游戏(太空阻击之一-浅谈游戏开发)
  4. 抖音的兴趣电商已经碰到流量天花板?
  5. 兰州市第五医院内六病区感染科简介及部分疾病健康教育
  6. 树莓派使用docker安装酷Q镜像时报错
  7. SQL Server 2008 - 第2章 创建、管理 数据库
  8. JS的Math对象,求数组的最大值max(),最小值min(),随机数 random()
  9. MAC上可以用的连接安卓、苹果手机的全功能助手-魔方手机助手
  10. Linux下安装Oracle11G详细过程