进程间通信之共享内存

一.对共享内存的认识

(1)共享内存是一种最为高效的进程间通信,进程可以直接读写内存,而不需要任何数据的拷贝。

(2)为了在多个进程间交换信息,内核专门流出了一块内存区,可以由需要访问的进程将其映射到自己的私有空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。

(3)由于多个进程共享一块内存,因此也需要依靠某种同步机制。

二.共享内存的操作流程

(1)创建/打开共享内存。

(2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。

(3)撤销共享内存映射。

(4)删除共享内存对象。

三.实现代码

shm.h

1 #include<stdio.h>

2 #include<sys/shm.h>

3 #include<sys/ipc.h>

4 #include<unistd.h>

5 #include<sys/types.h>

6 #include<sys/wait.h>

7 #define _PATH_ "."

8 #define _PROJ_ID_ 0x6666

9 #define _SHM_SIZE_ 1024*4

10 int get_shm();

11 char *at_shm(int shm_id);

12 int dt_shm(char* addr);

13 int destroy_shm(int shm_id);

shm.c

1 #include "shm.h"

2 int get_shm()

3 {

4         key_t _key=ftok(_PATH_,_PROJ_ID_);

5         int flag=IPC_CREAT|IPC_EXCL|0666;

6         int shm_id=shmget(_key,_SHM_SIZE_,flag);

7         if(shm_id<0)

8         {

9                 perror("shmget");

10                 return -1;

11         }

12         return shm_id;

13 }

14 char *at_shm(int shm_id)

15 {

16         return shmat(shm_id,NULL,0);

17 }

18 int dt_shm(char* addr)

19 {

20         return shmdt(addr);

21 }

22 int destroy_shm(int shm_id)

23 {

24         return shmctl(shm_id,IPC_RMID,NULL);

25 }

测试函数test.c

1 #include "shm.h"

2

3 int main()

4 {

5         int shm_id=get_shm();

6         pid_t id=fork();

7         if(id<0)

8         {

9                 perror("fork");

10                 return -1;

11         }

12         else if(id==0)

13         {

14                 char *buf=at_shm(shm_id);

15                 int i=0;

16                 while(i<10)

17                 {

18                         buf[i]=‘X‘;

19                         i++;

20                 }

21                 buf[10]=‘\0‘;

22                 dt_shm(buf);

23         }

24         else

25         {

26                 char *buf=at_shm(shm_id);

27                 sleep(2);

28                 printf("%s\n",buf);

29                 dt_shm(buf);

30                 //waitpid(id,NULL,0);

31                 destroy_shm(shm_id);

32         }

33         return 0;

34 }

运行结果:

时间: 2024-10-08 00:07:19

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

进程间通信(8) - 共享内存(posix)

1.前言 本篇文章的所有例子,基于RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686). 2.共享内存介绍 前面所讲述的Linux下面的各种进程间通信方式,例如:pipe(管道),FIFO(命名管道),message queue(消息队列),它们的共同点都是通过内核来进行通信(假设posix消息队列也是在内核中实现的,因为posix标准没有规定它的具体实现方式).向pipe,fifo,message queue写入数据时,需要把数据从用户空间(用户进程)复制到

Linux进程IPC浅析[进程间通信SystemV共享内存]

Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间,所有用户空间的进程若要操作共享内存,都要将其映射到自己的虚拟内存空间中,通过映射的虚拟内存空间地址去操作共享内存,从而达到进程间的数据通信 共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容 本身不提供同

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

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

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

Linux进程间通信-使用共享内存 转自: https://blog.csdn.net/ljianhui/article/details/10253345 下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像

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

概述 共享内存是进程间通信中最简单的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改. 共享内存的特点: 1)共享内存是进程间共享数据的一种最快的方法. 一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容. 2)使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥. 若一个进程正在向共享内存区写数据,则在它做

进程间通信(9) - 共享内存(System V)

1.前言 本篇文章的所有例子,基于RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686). 2.介绍 共享内存也是一种IPC,它是目前最快的IPC,它的使用方式是将同一个内存区映射到共享它的不同进程的地址空间中,这样这些进程间的通信就不再需要通过内核,只需对该共享的内存区域进程操作就可以了. 共享内存与其他的进程间通信最大的优点是:数据的复制只有两次,一次是从输入文件到共享内存区,一次从共享内存区到输出文件.而其他的则是需要复制4次:服务器将输入文件读入自己的进

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

下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 特别提醒:共

Linux进程间通信--mmap共享内存(一)

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反之亦然.由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入

Linux进程间通信--shmget()共享内存(二)

共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容.这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中.但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址. 图 共享内存映射图 象所有的 System V IPC对象一样,对于共享内存对象的获取

Linux进程间通信--shmget()共享内存(一)

大多数共享内存的具体实现,都是把由不同进程之间共享的内存映射为同一段物理内存. 多个进程都把该物理内存区域映射到自己的虚拟地址空间,这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信. 共享内存允许两个不相关的进程访问同一段物理内存, 由于数据不需要在不同的进程间复制,所以它是在两个正在运行的进程之间传递数据的一种非常有效的方式,一个进程向共享内存区域写入数据,共享该区域的所有进程就可以立刻看到其中的数据内容. 注意: 1.如上图所示,共享虚拟内存的页面,出现在每一个共享该页面的