Linux中的共享内存
来源:互联网 发布:java审批流 编辑:程序博客网 时间:2024/05/16 10:54
进程通讯的方式之一是共享内存,现就共享内存的相关函数做一下总结,借以与读者共勉,有无之处,还望批评指正
使用的头文件
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
分配函数:
int shmget(key_t key, size_t size, int shmflg);
函数成功返回的是申请的共享内存段的ID号,如果不成功返回-1.第一个参数key是表示共享内存区域的一个名字,它可以有两个值:IPC_PRIVATE 或者 是一个非零的随机数;当其值被设定为前者时说明此共享内存区域是新的未使用的;
第二个参数size则是表示分配的共享内存区域的大小;第三个参数表示的是:
IPC_CREAT:是说如果key如果不存在,那么将会分配共享内存,如果已经存在,而且此时参数IPC_EXCL没有被设置,此时就会返回key(此时可以用此函数获取已经存在的共享内存段的ID);
IPC_EXCL :是说如果key已经存在,那么共享内存分配失败;
控制函数:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
第一个参数是共享内存区域的id,第二个参数是说明对共享内存区域的控制类型其值可以是:
IPC_SET:从buf参数中取值,赋值给shmid_ds结构的ipc_perm域;
IPC_STAT:就是查找共享内存段的shmid_ds结构,并把它存到buf里面;
IPC_RMID:删除共享内存区域的id ,当最后一个进程离开时删除此区域;
SHM_LOCK:关闭共享内存区域,超级用户的进程可以使用此项命令;
SHM_UNLOCK:打开共享内存区域,超级用户的进程可以使用此项命令;
第三个参数buf是结构shmid_ds的地址;在系统中每一个共享内存段都有一个shmid_ds的结构;
附加共享内存函数:
void *shmat(int shmid, const void *shmaddr, int shmflg);
函数成功执行返回的是附加到进程的那个段的首地址;
第一个参数是为附加共享内存空间提供的id,第二个参数是附加共享内存区域的首地址,一般为零,系统自动分配;第三个参数是shmflg它的值可以如下:
SHM_RND:如果函数中第二个参数是零,那么次标志说明系统在需要时会自动完成地址的分配;
SHM_RDONLY:如果调用的进程拥有读权限,那么系统就会设定这段附件内存空间为只读;
推脱共享内存函数:
int shmdt(const void *shmaddr);
去掉进程与shmaddr所指向的内存的联系;
工具函数ftok()
key_t ftok( char * filepath, int id );
函数成功执行返回的是一个key,就是内存区域的描述符号,一般来说key的组成是id|filepath产生的索引号;
内存映射函数mmap()
使用头文件
#inlcude<sys/mman.h>
void *mmap(void *start,size_t length, int prot, int flags, int fd, off_t offset);
函数执行成功返回文件映射内存成功时的内存区域首地址;各个参数的含义如下:
Start是申请的内存区域的首地址,他要是0的话,内核就会随意分配内存起始地址如果不是0,就会在Start的附近进行内存分配;length是分配内存的长度,prot是设置的被映射内存区域的方位权限:
PROT_EXEC:只能执行
PROT_READ:只能读
PROT_WRITE:可以读写
PROT_NONE:不可访问
参数flags控制的是对映射内存区域数据的操作是否会影响被映射的文件的内容,
MAP_SHARED:会影响文件内容
MAP_PRIVATE: 不会影响文件内容
MAP_FIXED: 只能按start分配内存映射空间
文件内存映射过程:
打开文件
调用内存映射函数
取消内存映射函数:
int munmap(void *start, size_t length);
Start是函数mmap()的返回值,length是映射区域的大小;
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
- Linux中的共享内存
- linux中的共享内存
- Linux共享内存使用中的问题
- 进程中的共享内存
- Linux下的共享内存(03)---通过指针访问共享内存中的数据
- 关于linux共享内存中的一个重要函数shmget
- linux 共享内存--系统V共享内存
- linux 共享内存--System V共享内存
- linux 共享内存与nginx共享内存
- linux内存共享
- Linux的共享内存
- linux 内存共享
- Linux 共享内存
- Linux 共享内存
- Linux共享内存
- Linux共享内存
- linux共享内存
- linux 内存共享mmap
- python列表操作
- 并查集:Forming Teams(CF#133)
- opcagt-administer agent on Managed Node
- 剖析Windows任务管理器开发原理与实现
- struts2的default.properties详解
- Linux中的共享内存
- 冒泡排序(Bubble Sort)
- java 异常处理(二)
- js获取元素div相对body的距离
- H.264 学习笔记(二)
- DWR对象作用范围
- web service概述
- android学习之二 五大布局
- 第04章 异常处理 07 异常的其他问题