1、概念

不同进程看到共同区域

2、特点

(1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝)

(2)不提供任何同步互斥机制,也不自己维护

(3)接口简单

3、通信方式

由文件系统提供--管道

由system V提供--消息队列、信号量、共享内存

共享内存与信号量搭配使用

4、实现shmat、shmdt

at:挂接   dt:去挂接

0

1

2

1

0

创建

挂接

被另一进程看到

退出

再退出

代码实现:

shm.h文件:

#ifndef __SHM__

#define __SHM__

#include

#include

#include

#include

#include

#define __PATH__ "."

#define __PROJECT__ 8888

#define __SHM_SIZE__ 4096

int get_shm();

char* at_shm();

int delete_shm();

int rm_shm();

#endif

shm.c文件:

#include"shm.h"

int get_shm()

{

key_t key=ftok(__PATH__,__PROJECT__);

int flag=IPC_CREAT|0666;

int shm_id=shmget(key,__SHM_SIZE__,flag);

if(shm_id==-1){

printf("get share memory error!\n");

}else{

printf("get share memory success!\n");

}

return shm_id;

}

char *at_shm(int shm_id)

{

return(char*)shmat(shm_id,NULL,0);

}

int delete_shm(char *addr)

{

return shmdt(addr);

}

//if success,return(),else return -1

int rm_shm(int shm_id)

{

return shmctl(shm_id,IPC_RMID,NULL);

}

test_shm.c文件:

#include"shm.h"

int main()

{

int shm_id=get_shm();

pid_t id=fork();

if(id<0){

printf("fork error\n");

return 1;

}else if(id==0){//child

char *buf=at_shm(shm_id);

int i=0;

while(i<4096){

buf[i]='X';

i++;

}

buf[4096]='\0';

delete_shm(buf);

}else{     //father

char *buf=at_shm(shm_id);

sleep(5);

printf("%S\n",buf);

delete_shm(buf);

waitpid(id,NULL,0);

rm_shm(shm_id);

}

return 0;

}

Makefile文件:

test_shm:shm.c test_shm.c

gcc -o $@ $^

.PHONY:clean

clean

rm -f test_shm

运行结果:

[zr@localhost shm]$ make

gcc -o test_shm shm.c test_shm.c

[zr@localhost shm]$ ./test_shm

get share memory success!

[zr@localhost shm]$

linux共享内存通信方式,linux下进程通信方式--共享内存相关推荐

  1. linux ps内存占用率,linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定...

    背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况. 一. linux ps命令,查看某进程cpu和内存占用率情况 [root@test vhost]# ps aux US ...

  2. 使用内存映射文件在进程之间共享数据

    数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面.因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中 ...

  3. Linux下进程通信---共享内存之:shm

    进程通信:进程与进程间的数据交换,称为进程通信.进程通讯的方式有:共享内存.信号量.管道.消息队列.socket等等. 共享内存:内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内 ...

  4. xp计算机怎么共享网络,windows XP下如何实现共享上网的方法

    通常来说共享本地连接的电脑即网关电脑要有两块网卡(其中一块是有线或无线网卡),并且有交换机或集线器等网络设备,电脑与电脑之间通过网络设备或无线局域网连接下面是学习啦小编为大家整理的关于windows ...

  5. linux 系统日志 查看被杀掉的进程(占用内存过大)

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  6. linux java 进程内存_linux – 在java进程中消耗内存的是什么?

    我们正在尝试在中等负载下研究 java进程的内存使用情况. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 12663 test 20 0 ...

  7. 操作系统核心原理-5.内存管理(下):段式内存管理

    一.分页系统的缺点 分页系统存在的一个无法容忍,同时也是分页系统无法解决的一个缺点就是:一个进程只能占有一个虚拟地址空间.在此种限制下,一个程序的大小至多只能和虚拟空间一样大,其所有内容都必须从这个共 ...

  8. linux共享内存示例,linux 进程间共享内存示例

    写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...

  9. 进程间的通信方式(一):共享内存

    共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存.由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache).任何一个缓 ...

最新文章

  1. 推荐7个能提高工作效率的办公软件,拯救你的工作!
  2. TensorFlow 图像数据预处理及可视化
  3. python科学计算三剑客_《Python数据分析三剑客:Pandas、Numpy、Matplotlib》专题
  4. DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
  5. SSD 通俗易懂介绍
  6. RMI non-JRMP server at remote endpoint
  7. 关于App开发:模拟服务器数据接口 - MockApi
  8. python删除文本中指定内容_Python实现删除文件中含“指定内容”的行示例
  9. [转载]MVP(SC),MVP(PV),PM,MVVM 和 MVC 表现模式架构对比
  10. 如何交到一个女朋友?
  11. ac2100 反弹shell无法粘贴_记一次突破反弹shell
  12. POJ 1947 Rebuilding Roads (树dp + 背包思想)
  13. 盒子模型(W3C盒子和IE盒子)
  14. 设置c++程序的堆栈空间解决栈溢出问题
  15. HP服务器集成 iLO 端口的配置
  16. matlab多种图像边缘检测方法,[转载]Matlab多种图像边缘检测方法
  17. 微信公众账号分为哪几类?区别是什么?
  18. Java实现蓝桥杯快乐数
  19. ie下js判断本地office版本
  20. java.net.ConnectException: [NACOS HTTP-POST] The maximum number of tolerable server reconnection err

热门文章

  1. ArcBruTile 0.2.2
  2. Excel技巧之——英文大小写转换(转)
  3. 需求的推动力-网线啥的
  4. ECShop 模板库项目功能详解
  5. 将表中的值变成字段显示
  6. RIPv1和v2综合实验(CCNP阶段)
  7. 整洁代码之道——重构
  8. 真正能解决 Windows 7下安装Office 2007—2010出现1402和1406类错误的方法
  9. 在aptana3中使用scriptDoc__scriptDoc 2.0完全参考
  10. VirtualBox中为WinXP虚拟机添加主体机共享