加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX环境高级编程:System V 共享内存区

发布时间:2016-09-27 17:03:35 所属栏目:Unix 来源:站长网
导读:副标题#e# 共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存

2.shmat函数(共享内存映射)

由shmget创建或打开一个共享内存区后,通过调用shmat把它附接到调用进程的地址空间。

#include <sys/shm.h>  
void* shmat(int shmid,const void *shmaddr,int flag);

其中shmid是由shmget返回的标识符。shmat的返回值是所指定的共享内存区在调用进程内的起始地址。确定这个地址的规则如下:

(1)如果shmaddr是一个空指针,那么系统替调用者选择地址。这是推荐的方法。

(2)如果shmaddr是一个非空指针,那么返回地址取决于调用者是否给flag参数指定了SHM_RND值:

a.如果没有指定SHM_RND,那么相应的共享内存区附接到由shmaddr参数指定的地址;

b.如果指定了SHM_RND,那么相应的共享内存附接到由shmaddr参数指定的地址向下舍入一个SHMLBA常值。LBA代表“低端边界地址”。

默认情况下,只要调用进程具有某个共享内存区得读写权限,它附接该内存区后就能够同时读写该内存区。flag参数中也可以指定SHM_RDONLY值,它限定只读访问。flag参数默认是0,表示共享内存可读写。

3.shmdt函数(共享内存解除映射)

当一个进程完成某个共享内存区的使用时,它可以调用shmdt断接这个内存区。

#include <sys/shm.h>  
int shmdt(const void *shmaddr);

当一个进程终止时,它当前附接着的所有共享内存区都自动断接掉。

注意本函数调用并不删除所指定的共享内存区。这个删除工作通过以IPC_RMID命令调用shmctl完成。

4.shmctl函数

shmctl提供了对一个共享内存区的多种操作。

#include <sys/shm.h>  
int shmctl(int shmid,int cmd,struct shmid_ds *buff);

该函数提供了三个命令:

IPC_RMID   从系统中删除由shmid标识的共享内存区并拆除它。

IPC_SET     给所指定的共享内存区设置其shmid_ds结构的以下三个成员:shm_perm.uid,shm_perm.gid和shm_perm.mode,他们的值来自buff参数指向的结构中的相应成员。shm_ctime的值也用当前时间替换。

IPC_STAT    (通过buff参数)向调用者返回所指定共享内存区当前的shmid_ds结构。

5.shmget程序(shmget.c)

下面是给出的shmget程序使用指定的路径名和长度创建一个共享内存区。

#include "unpipc.h"  
int main(int argc,char ** argv)  
{  
  int c,id,oflag;  
  char *ptr;  
  size_t length;  
  oflag = SVSHM_MODE | IPC_CREAT;  
  while( ( c= getopt(argc,argv,"e") ) != -1 )  
   {  
     switch(c){  
     case 'e':  
         oflag |= IPC_EXCL;  
         break;  
      }  
    }  
   if(optind != argc -2)  
     err_quit("usage: shmget [-e] <pathname> <length>");  
      
   length = atoi(argv[optind + 1]);  
   id = shmget(ftok(argv[optind],0),length,oflag);  
   ptr = shmat(id,NULL,0);  
   exit(0);  
}

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读