linux下进程通信方式--共享内存

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<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<unistd.h>

#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]$

时间: 2024-07-31 11:43:37

linux下进程通信方式--共享内存的相关文章

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

Linux下进程间通信之共享内存

共享内存便是在内存里申请一块空间,这块空间可以有多个进程拥有,其申请的空间必须是4096的整数倍,可以读写数据,其效率是system V 版本中几种通信方式间最高效的,但它的同步与互斥需要自己来维护,因此其常与信号量结合起来使用. 下面是一个简单的实现: shm.h shm.c 测试函数: 运行结果:

linux下多进程+信号量+共享内存编程

此程序实现没有亲缘关系的两个进程间通过共享内存进行数据通信. 同时,使用信号量保证两个进程的读写同步:发送方在写共享内存时,接收方不能读数据:接收方在读数据时,发送方不能写数据. 1.fork创建子进程 2.使用二元信号量,同步读写端 fork_shm.c #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include"send_recv.h" int main(void) {

Linux程序设计学习笔记----System V进程通信(共享内存)

转载请注明出处:http://blog.csdn.net/suool/article/details/38515863 共享内存可以被描述成内存一个区域(段)的映射,这个区域可以被更多的进程所共享.这是IPC机制中最快的一种形式,因为它不需要中间环节,而是把信息直接从一个内存段映射到调用进程的地址空间. 一个段可以直接由一个进程创建,随后,可以有任意多的进程对其读和写.但是,一旦内存被共享之后,对共享内存的访问同步需要由其他 IPC 机制,例如信号量来实现.象所有的System V IPC 对象

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内.Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1.内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件.(上一节就是这种技术) 2.共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间.(本节内容) Posix共享内存区涉及以下两个步骤要求: 1.指定一个名字参数调用shm_open

进程-IPC 共享内存和消息队列 (三)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%89).md 五 共享内存 5.1. 共享内存简介 共享内存指多个进程共享同一块物理内存,它只能用于同一台机器上的两个进程之间的通信.在进程的逻辑地址空间中有一段地址范围是用来进行内存映射使用的,该段逻辑地址空间可以映射到共享的物理内存地址上(进程空间介绍:http://blog.csdn.net/zhangzhebjut/article/details/3906025

Linux下程序运行时内存状态及相应查看工具

最近在解决一个编译问题时,一直在考虑一个问题,那就是Linux下可执行程序运行时内存是什么状态,是按照什么方式分配内存并运行的.查看了一下资料,就此总结一下,众所周知,linux下内存管理是通过虚存管理的,在分配内存是并非在物理内存开辟了一段空间,而是在使用时才分配的,而且是通过段页式管理.以上比较废话,开始看看程序运行时内存会是什么状态. 在linux下内存分配是以页为单位的,而页是通过段管理,各个段之间是独立的,方便管理.linux程序运行时,可以分为以下几个内存段: 一.BSS段 (bss

Linux环境进程间通信:共享内存

共享内存简介 共享内存允许两个或多个进程共享一给定的存储区.因为数据不需要在客户进程和服务器进程之间复制,所以这是最快的一种IPC.共享内存的方式有两种:mmap()系统调用和系统V共享内存. mmap()系统调用 mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作. 注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的.它本身提供了不同于一般对普

Linux 下进程与线程的基本概念

2019-10-01 关键字:进程.线程.信号量.互斥锁 什么是程序? 程序就是存放在磁盘上的指令和数据的有序集合,就是源代码编译产物. 它是静态的. 什么是进程? 进程就是操作系统为执行某个程序所分配的资源的总称.进程是程序的一次执行过程,因此它与程序不同,它是动态的.它的生命周期包括创建.调度.执行和消亡. 进程的内容主要包括以下三个部分: 1.正文段: 2.用户数据段: 3.系统数据段. 其中正文段与用户数据段两部分是从程序当中来的.而系统数据段则是操作系统分配的用来管理这个进程用的. 系