UNIX情形高级编程:System V 共享内存区
副标题[/!--empirenews.page--]
共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。 共享内存的实现,分为两个步骤: 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函数的目的。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |