共享内存

来源:互联网 发布:淘宝 清明上河图 编辑:程序博客网 时间:2024/05/22 08:04

本文部分转载自:http://blog.csdn.net/ljianhui/article/details/10253345
进程间通信的一个主题:共享内存
一、什么是共享内存?
顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
这里写图片描述

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。有关信号量的更多内容,可以查阅我的另一篇文章:信号量
二、共享内存的使得
与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。

  1. 申请共享内存
    这里写图片描述

    第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
    不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。
    第二个参数,size以字节为单位指定需要共享的内存容量

  2. 销毁共享内存
    这里写图片描述

第一个参数,shm_id是shmget函数返回的共享内存标识符。

第二个参数,command是要采取的操作,它可以取下面的三个值 :
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段

第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。

3.挂接操作、去关联操作
这里写图片描述
shmat函数:
第一个参数,shm_id是由shmget函数返回的共享内存标识。
第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
第三个参数,shm_flg是一组标志位,通常为0。

shmdt函数:
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.

使用共享内存的优缺点
1、优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系。

内存共享的程序实例:实现进程servet和client之间的内存共享servet创建共享内存空间,和内存空间挂接,并向内存空间每隔一秒多输入一个大写的英文字母。然后client进程之间访问共享内存并输出,并每隔一秒输出共享内存的内容,完成之后两个进程分别和共享内存取消关联,然后在servet进程中销毁共享内存。
代码图:
comn.h头文件
这里写图片描述
共享内存接口comn.c文件
这里写图片描述
这里写图片描述
servet.c文件
这里写图片描述
client.c文件
这里写图片描述

运行结果图:
这里写图片描述

0 0
原创粉丝点击