UNPv2第十四章:System V共享内存区

1 shmget函数

#include <sys/shm.h>
int shmget(key_t key, size_t size, int oflag)
返回一个共享区标识符

Key既可以是ftok返回值,也可以是IPC_PRIVATE
Size以字节为单位指定内存区大小

2 shmat函数

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

连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
 如果shmaddr是一个空指针,那么系统调用者选择地址
 如果shmaddr是一个非空指针,那么返回地址取决于调用者是否给flag指定SHD_RND:
 如果SHD_RND没有指定,那么相应的共享内存区附接到由shmaddr参数指定的地址
 如果SHD_RND指定了,那么相应的共享内存区附接到shmaddr参数指定的地址向下舍入一个SHMLBA常值(LBA:低端边界地址)

3 shmdt函数

#include <sys/shm.h>
int shmdt(const void *shmaddr);
        断开共享内存连接

4 shmctl函数(完成对共享内存的控制)

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

cmd有如下取值:
 IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
 IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
 IPC_RMID:删除这片共享内存

5 共享内存区的限制

UNPv2第十四章:System V共享内存区_第1张图片

6 小结

System V共享内存区最新常用的函数调用是:
 shmget获取一个标识符
 shmat把一个共享内存区附接到调用进程的地址空间
 以一个IPC_STAT命令调用shmctl:获取一个已存在共享内存区的大小
 以一个IPC_RMID命令调用shmctl:删除一个共享内存区对象

后记

APUE,UNPv1,UNPv2已经看完了,一些基本的操作还是能看懂的。由于UNP两本书上的有些代码在APUE中已经贴出来了,所以就没有再次粘贴,所以UNP两本书的学习笔记只有一些概念性的介绍,没有代码。有兴趣可以自己买本书或者下载pdf自行查阅

你可能感兴趣的:(UNPv2第十四章:System V共享内存区)