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 [email protected] $^

.PHONY:clean

clean

rm -f test_shm

运行结果:

[[email protected] shm]$ make

gcc -o test_shm shm.c test_shm.c

[[email protected] shm]$ ./test_shm

get share memory success!

[[email protected] shm]$

时间: 07-07

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

  1. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  2. linux ps vsz malloc,认真分析下进程的内存,说说VSZ、RSS、PSS

    进程占用的内存可以有以下这些类型:自身的代码 共享库的代码 运行过程分配的堆和栈 通过mmap映射的磁盘文件内容 1. 虚拟内存与物理内存 这里要区分两个概念,虚拟内存和物理内存.物理内存对于进程来说 ...

  3. linux程序间管道通信,linux进程间通信——管道 详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入.常说的管道多是指无名管道, 无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有名管道叫nam ...

  4. 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    <实验2 进程控制与通信管理word文档良心出品>由会员分享,可在线阅读,更多相关<实验2 进程控制与通信管理word文档良心出品(13页珍藏版)>请在人人文库网上搜索. 1. ...

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

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

  6. linux增量安装tomcat_linux与windows下tomcat的java内存设置

    Linux下修改JVM内存大小: 要添加在tomcat 的bin 下catalina.sh文件中,找到cygwin=false,在这一行的前面加入参数,具体如下# vi TOMCAT_HOME/bin ...

  7. linux c 禁止对外通信,Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  8. linux c 禁止对外通信,Linux C套接字:在recv调用时被阻止

    在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起. 但是,如果尝试使用linux GET命令连接到应用程序的 ...

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

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

  10. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

最新文章

  1. [MySQL]Every derived table must have its own alias
  2. pandas使用isna函数和any函数计算返回dataframe中包含缺失值的数据行(rows with missing values in dataframe)
  3. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
  4. 编程之美-连连看游戏设计方法整理
  5. 震惊kafka_5个令人震惊的统计数据证明日志不足
  6. mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?
  7. jQuery 1.7.1 代码研究 extend
  8. ChaosBlade 发布对 C++ 应用混沌实验的支持
  9. jpa 托管_java – jpa非托管实体
  10. ffmpeg 分辨率 压缩_Ffmpeg 视频压缩的几个关键参数
  11. [RMI TCP Connection(10.0.20.175:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for
  12. GridView中使用DropDownList的OnSelectedIndexChanged事件
  13. kettle-如何在kettle中编写java代码
  14. 各厂商服务器存储默认管理口登录信息(默认IP、用户名、密码)
  15. 【运筹学】线性规划数学模型 ( 求解基矩阵示例 | 矩阵的可逆性 | 线性规划表示为 基矩阵 基向量 非基矩阵 非基向量 形式 )
  16. 转载:虚拟机安装centos6.5出现 unsupported hardware detected 解决方法
  17. 微信小说项目如何防止域名屏蔽
  18. 记录-老联想笔记本安装 centos8
  19. 《Python编程初学者指南》 道森中文版附源代码
  20. ubuntu 20.04.3 安装教程(本人一步一步安装记录...)

热门文章

  1. flex布局 详细开发教程
  2. 解决curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  3. Android 手动解析JSON数据
  4. 十大算法 — 插入排序法【C语言代码诠释】
  5. Linux的tasklet函数详解
  6. 第十章 嵌入式linux的调试技术
  7. (原创)一个简洁通用的调用DLL函数的帮助类
  8. Python 清理项目的目录
  9. vs2017html乱码,vs2017引用vue组件中文乱码
  10. C/C++ 基础算法1