学无止境……
分类: LINUX
2014-07-09 11:55:20
关于IPC(Inter-process Communication)共享内存的定义网上很多,此处就在百度百科摘录一段。
因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。
因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许两个进程同时向同一个共享内存地址写入数据等。解决这些问题的常用方法是通过使用信号量进行同步。
1>mmp()通过映射一个普通文件实现共享内存,具有文件实体,shmget()对应文件在内存中,无文件实体。
2>mmp()不建议使用叠加方式共享,shmget()用于多个进程间交换数据。
3>mmp() shmget() 进程重启后共享内存中的数据都不会丢失;但是机器重启后只有mmp()方式的共享内存可以保存数据
4>mmap()接口更简单,通用性也更高。
mmap()系统调用共享内存
#include
Void *mmap(void *addr, ---> 映射区的开始地址,设置为0/NULL时表示由内核决定
size_t length, ---> 映射到进程地址控件的字节数。以字节为单位,不足一内存页按一内存页处理(一般默认页内存为4kb)
int prot, ---> protection,指定访问权限,有如下值:
PROT_EXEC //可执行
PROT_READ //可读取
PROT_WRITE //可写入
PROT_NONE //不可访问
int flags, ---> 指定映射对象的类型,映射选项和映射页是否可以共享,常用值见下表。
int fd, ---> 有效的文件描述符。一般是由open()函数返回,设置为-1,表明进行的是匿名映射(需设定flags的MAP_ANON值)
off_t offset) ---> 被映射对象内容的起点,一般设为0
Return ---> 最后文件映射到进程空间的地址
Function:通过映射一个普通文件实现共享内存
int munmap(void *addr, ---> 调用 mmap()返回时的地址
size_t lenght) ---> 映射区大小
Return ---> 解除映射成功则返回0,否则返回-1,错误原因存于errno中错误代码EINVAL
Function:解除一个映射关系
Int msync(void *addr, Size_t length, Int flags)
Return ---> 成功则返回0;失败则返回-1
Function:同步磁盘与共享内存区
System V 共享内存
#includeInt shmget(key_t key, ---> IPC结构的键值,一般取IPC_PRIVATE (保证系统建立新共享内存块)
Size_t size, ---> 大于0:新建的共享内存大小,以字节为单位;等于0:表示引用已有共享内存
Int shmflg) ---> 主要和一些标志有关。其中有效的包括IPC_CREAT和IPC_EXCL,它们的功能与open()的O_CREAT和O_EXCL相当。需要注意的是,使用参数要加上 | 0666 作为校验
Return ---> 返回共享内存的标识符(shmid);出错返回-1,错误原因存于error中
Function:得到一个共享内存标识符 或 创建一个共享内存对象
Void *shmat(int shmid, ---> shmget 返回的 shmid 值
const void *addr, ---> 内存区映射到进程哪个地址上,一般为 0/NULL 表示由内核分配可用内存地址。
int flag) ---> 设SHM_RDONLY时为指定,否则度读写方式映射
Return ---> 成功:映射到进程的地址;错误:返回-1,错误原因存于error中
Function:把共享内存区对象映射到调用进程的地址空间
Int shmdt(void *addr)
Return ---> 成功返回0,失败返回-1
Function:解除共享内存的映射