共享内存
共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间。这是最快的进程间通信方式,但是不提供任何同步功能(需要我们信号量实现)。
使用共享内存实现生产者消费者任务模式。
共享内存系统调用
#include #include#include
int semget(key_t key, int size, intflag);void *shmat(int shmid, void *addr, intflag);int shmdt(void *addr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmget函数:
功能:获得或创建一个共享内存标识符。
int semget(key_t key, size_t size, int shmflag);
成功返回一个共享内存标识符,失败返回-1;
第一个参数key为共享内存段命名(一般由ftok产生);
第二个参数size为需要共享的内存容量。(如果共享内存已存在时,不能不大于该共享内存段的大小);
第三个参数设置访问权限(低9位)与IPC_CREAT, IPC_EXCL 的按位或。
shmat函数
功能:将共享内存段连接到一个进程的地址空间中。
void *shmat(int shm_id, const void *addr, int shmflg) ;
成功返回共享存储段连接的实际地址,失败返回-1
第一个参数shm_id为shmget返回的共享内存标识符。
第二个参数addr指明共享内存段要连接到的地址(进程空间内部地址),通常指定为空指针,表示让系统来选择共享内存在进程地址空间中出现的地址。
第三个参数shmflg可以设置为两个标志位(通常设置为0)
SHM_RND( 表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍)
SHM_RDONLY,要连接的共享内存段是只读的。
shmdt函数
功能:将共享内存从当前进程中分离。
int shmdt(const void *shmaddr) ; //其中shmaddr为shmat返回的地址。
shmctl函数
功能:查看及修改共享内存段的shmid_ds结构,删除该结构以及相连的共享存储段标识。
int shmctl(int shm_id, int command, struct shmid_ds *buf) ;
成功返回0,失败返回-1
第二个参数commad取值:
IPC_STAT 获取当前共享内存段的shmid_ds结构
IPC_SET 把共享内存段