一,共享内存
  内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存。
  映射物理内存叫挂接,用完以后解除映射叫脱接

1,共享内存的特点:

  优点:是最快的IPC。
  缺点:要编程者自己实现对共享内存互斥访问。如何实现?

2,编程模型:具体函数的用法可以用man手册查看(强力推荐)

进程A: writeshm.c
     1) 获得key, ftok()
     2) 使用key来创建一个共享内存 shmget()
     3) 映射共享内存(得到虚拟地址), shmat()
     4) 使用共享内存, 往共享内存中写入数据
     5) 解除映射 shmdt()
     6) 如果共享内存不再使用,可以使用shmctl()销毁共享内存

进程B: readshm.c

  1) 获得key, ftok()

  2) 使用key来获得一个共享内存 shmget()

  3) 映射共享内存(得到虚拟地址), shmat()

  4) 使用共享内存, 读取共享内存中的数据

  5) 解除映射 shmdt()

3,实例

进程A:

// writeshm.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h> int main()
{
// 生成一个key
key_t key = ftok("./", ); // 创建共享内存,返回一个id
int shmid = shmget(key, , IPC_CREAT||IPC_EXCL);
if(- == shmid)
{
perror("shmget failed");
exit();
} // 映射共享内存,得到虚拟地址
void *p = shmat(shmid, , );
if((void*)- == p)
{
perror("shmat failed");
exit();
} // 写共享内存
int *pp = p;
*pp = 0x12345678;
*(pp + ) = 0xffffffff; // 解除映射
if(- == shmdt(p))
{
perror("shmdt failed");
exit();
}
printf("解除映射成功,点击回车销毁共享内存\n");
getchar(); // 销毁共享内存
if(- == shmctl(shmid, IPC_RMID, NULL))
{
perror("shmctl failed");
exit();
} return ;
}

进程B:

// readshm.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h> int main()
{
// 生成一个key
key_t key = ftok("./", ); // 获取共享内存,返回一个id
int shmid = shmget(key, , );
if(- == shmid)
{
perror("shmget failed");
exit();
} // 映射共享内存,得到虚拟地址
void *p = shmat(shmid, , );
if((void*)- == p)
{
perror("shmat failed");
exit();
} // 读共享内存
int x = *(int *)p;
int y = *((int *)p + );
printf("从共享内存中都取了:0x%x 和 0x%x \n", x, y); // 解除映射
if(- == shmdt(p))
{
perror("shmdt failed");
exit();
} return ;
}

运行结果:

writeshma:

readshma:

Linux进程间通信之共享内存的更多相关文章

  1. Linux进程间通信—使用共享内存

    Linux进程间通信-使用共享内存 转自: https://blog.csdn.net/ljianhui/article/details/10253345 下面将讲解进程间通信的另一种方式,使用共享内 ...

  2. Linux进程间通信——使用共享内存

    一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存. ...

  3. linux进程间通信之共享内存篇

    本文是对http://www.cnblogs.com/andtt/articles/2136279.html中共享内存(上)的进一步阐释说说明 1 共享内存的实现原理 共享内存是linux进程间通讯的 ...

  4. Linux进程间通信——使用共享内存(转)

    一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存. ...

  5. Linux进程间通信(四) - 共享内存

    共享内存的优势 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...

  6. linux进程间通信之共享内存学习记录

    进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的 ...

  7. linux进程间通信同步-共享内存

    参考:https://www.cnblogs.com/charlesblc/p/6142868.html 使用有名信号量,sem_open().sem_close().sem_post().sem_w ...

  8. 浅析Linux下进程间通信:共享内存

    浅析Linux下进程间通信:共享内存 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以它是最快的一种IPC.使用共享内存要注意的是,多个进程之间对一给定 ...

  9. Linux环境进程间通信(五): 共享内存(下)

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

随机推荐

  1. 用MsmqBinding投送message出现的一个灵异事件 【第二篇】

    一直都在用Msmqbinding,也一直忽视了message里面的内容格式是什么样的,这也是微软给我们高层封装带给我们的开发效率,但同时一旦中间出了什么问题, 就不知道从何查起了.有个需求是这样的,服 ...

  2. Javascript之旅——第十站:为什么都说闭包难理解呢?

    研究过js的朋友大多会说,理解了js的原型和闭包就可以了,然后又说这些都是js的高级内容,然后就又扯到了各种神马的作用域...然后不少 人就会被忽悠的云里雾里...下面我也试着来说说闭包,看我说的这个 ...

  3. Tomcat源码分析之—容器整体结构

    Tomcat有多个容器组成,而Container也就是容器与Connecter连接器是Tomcat最核心的两个模块,Connecter连接器接收客户端的请求,并根据客户端的请求传递给Container ...

  4. 编写NPAPI plugin的命名问题

    最近写了个NPAPI的插件,在chrome上用得好好的,结果在火狐上死活不认我的插件,找了N多资料最后在官方的说明里才找到说火狐浏览器的插件的文件名必须是以np开头的,立刻吐血三升,难怪被chrome ...

  5. Observe the 0CTF & 0CON

    I went to observe 0CTF and 0CON on 4.22 ~ 4.24 and just come back. Not only do I learn a lot from th ...

  6. POJ3494Largest Submatrix of All 1’s[单调栈]

    Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 5883   Ac ...

  7. AC日记——有趣的跳跃 openjudge 1.6 07

    07:有趣的跳跃 总时间限制:  1000ms 内存限制:  65536kB 描述 一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1). ...

  8. [No000039]操作系统Operating Systems用户级线程User Threads

    多进程是操作系统的基本图像 是否可以资源不动而切换指令序列? 进程 = 资源 + 指令执行序列 线程: 保留了并发的优点,避免了进程切换代价 实质就是映射表不变而PC 指针变 多个执行序列+ 一个地址 ...

  9. Eclipse启动时布局不合理调整

    1. 关掉 启动页 2. 关掉InstSearch页 3.修正InSearch布局 3.1 默认InstSearch不合理,影响使用. 3.2 Inst 搜索一次,然后最小化InstSearch框,再 ...

  10. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 成熟组件化运行效果分解

    1:成熟的组件就是可以写很少的代码,可以实现很多功能.2:又可以用源码方式调用,又可以用dll方式调用.3:不需要学习里面的细节,只要会调用就可以了.4:成熟稳定,功能齐全,bug少,甚至没bug.5 ...