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是映射区域的大小;

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

 

原创粉丝点击