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

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

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

共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。

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

共享内存的实现,分为两个步骤:

a. 创建共享内存,使用 shmget 函数。

b. 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用 shmat 函数。

对于每个共享内存区,内核维护如下的信息结果,它定义在<sys/shm.h>头文件中:

struct shmid_ds {  
    struct ipc_perm shm_perm;    /* Ownership and permissions */
    size_t          shm_segsz;   /* Size of segment (bytes) */
    time_t          shm_atime;   /* Last attach time */
    time_t          shm_dtime;   /* Last detach time */
    time_t          shm_ctime;   /* Last change time */
    pid_t           shm_cpid;    /* PID of creator */
    pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */
    shmatt_t        shm_nattch;  /* current #attached */
    shmat_t         shm_cnattch; /* in-core #attached */
};

下面是ipc_per 结构,它含有本共享内存区的访问权限。

struct ipc_perm {  
    key_t          __key;    /* Key supplied to shmget(2) */
    uid_t          uid;      /* Effective UID of owner */
    gid_t          gid;      /* Effective GID of owner */
    uid_t          cuid;     /* Effective UID of creator */
    gid_t          cgid;     /* Effective GID of creator */
    unsigned short mode;     /* Permissions + SHM_DEST and SHM_LOCKED flags */
    unsigned short __seq;    /* Sequence number */
};

1.shmget函数(创建共享内存)

shmget函数创建一个新的共享内存区,或者访问一个已存在的共享内存区。

#include <sys/shm.h>  
int shmget(key_t key,size_t size,int oflag);

返回值是一个称为共享内存区标识符的整数,其他三个shmXXX函数就用它来指代这个内存区。

key即可以是ftok的返回值,也可以是IPC_PRIVATE。

size以字节为单位指定内存区的大小。当时机操作为创建一个新的共享内存区时,必须指定一个不为0的size值。如果实际操作为访问一个已存在的共享内存区,那么size应为0.

oflag是读写权限的组合。它还可以与IPC_CREAT或IPC_CREAT | IPC_EXCL按位或。

当实际操作为创建一个新的共享内存区时,该内存区被初始化为size字节的0.

注意,shmget创建或打开一个共享内存区,但并没有给调用进程提供访问该内存区的手段。这是shmat函数的目的。

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

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

推荐文章
    热点阅读