IPC之共享内存

头文件: sys/shm.h


ipcs  -m #查看共享内存状况




1、共享内存的创建
shmget 函数


同一段内存被不同进程共享
但是共享内存并不提供同步机制
需要信号量等加以辅助


int shmget(key_t key, size_t size,int shmflg)
@key IPC_PRIVATE 只属于创建进程   一般不会用 用的是(key_t)1234   不同的进程使用同一个key来连接同一个共享内存
        @size 内存容量大小
        @shmflg  文件打开权限mode 0666|IPC_CREAT


            不相关的进程可以通过该函数的返回值访问同一共享内存


2、shmat函数
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问
并把共享内存连接到当前进程的地址空间


void * shmat(int shm_id, const void *shm_addr,int shmflg)
@shm_id 是由shmget返回的共享内存标识
@shm_addr 指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
@shmflg 一组标志位,通常为0


       调用成功时,返回一个指向共享内存第一个字节的指针,如果调用失败返回-1


3、shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离,并不是删除它,而是当前进程不能再使用该共享内存
int shmdt(const void *shmaddr)
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败返回-1


4、shmctl函数
与信号量的semctl函数一样,用来控制共享内存
int shmctl(int shm_id,int cmd,struct shmid_ds *buf)
第一个参数 shm_id是shnmget函数返回的共享内存标识
第二个参数 cmd是要采用的操作,可以取下面三个值:

IPC_STAT   把shmid_ds 结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值
IPC_SET    如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID   删除共享内存段


第三个参数 buf是一个结构指针,它指向共享内存模式和访问权限的结构
shmid_ds结构至少包括以下成员
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};

5、使用共享内存进行进程间通信


生产者消费者案例


















































posted @ 2016-07-14 19:26  cloudren2020  阅读(132)  评论(0编辑  收藏  举报