System V共享内存

System V 与Posix 共享内存区

二者的差别是:

(1)Posix共享内存区是先调用shm_open然后再调用mmap,System V 共享内存区是先调用shmget再调用shmat。

(2)Posix共享内存区对象的大小可在任何时刻通过ftruncate修改,而System V 共享内存区对象的大小是在调用shmget创建时固定下来的。

  • 1、int shmget(key_t key, size_t size, int shmflg);  

        key: 函数ftok返回值,或者IPC_PRIVATE ,当使用IPC_PRIVATE时,最好两个进程空间是共享的,比如父子进程,否则当前进程产生的共享内存标识(返回值),在另一个进程里面不易得到;

        ftok函数原型为:key_t ftok(const char *pathname, int proj_id); 参数pathname为文件绝对路径名,proj_id为一个整型标识符,该函数将一个已存在的的路径名和一个整型标识符转化成一个key_t值(返回 值),称为IPC键。

        size:创建新的共享内存大小,当创建一片新的共享内存时,该值为不为0的参数。如果是读取一片共享内存,该值可以为0。

        shmflg:读写权限值组合。IPC_CREAT(创建新的共享内存)或IPC_CREAT|IPC_EXCL(当将要创建的共享内存已经存在时,再试 图创建将返回EEXIST)。其实IPC_CREAT和IPC_EXCL的组合和open函数的O_CREAT和O_EXCL组合类似。

        函数返回共享内存区的标识。shmxxx函数操作共享内存将使用该函数返回值。该函数类似posix共享内存shm_open函数功能。

​2、void *shmat(int shmid, const void *shmaddr, int shmflg); 

shmid:是函数shmget函数返回的共享内存标识符。

shmaddr: 连接到调用进程地址空间的地址,如果该参数为NULL,系统选择一个合适地址;如果shmaddr非空并且shmflg指定了选项SHM_RND,那么相 应的共享内存链接到由shmaddr参数指定的地址向下舍入一个SHMLAB常值。如果shmaddr非空并且shmflg未指定SHM_RND,共享内 存地址链接到shmaddr参数指定的地址。

 shmflg:可以指定SHM_RND和SHM_RDONLY(只读),如果指定SHM_RDONLY选项,那么调用进程对该片共享内存只有读权限,否则,进程对该片内存将有读写权限。

shmat函数成功返回当前进程共享内存地址,失败返回(void *)-1;

3、int shmdt(const void *shmaddr);  

shmdt成功返回0,失败返回-1;​

当shmget创建或打开一个共享内存区后,需要使用函数shmat来将该片共享内存连接到当前进程空间中来,当某一进程使用完共享内存后,使用函数shmdt断开和共享内存的链接。函数shmdt不会删除指定的共享内存,它只是断开和该片共享内存的链接而已。当一个进程终止后,该进程链接的共享内存将自动断开。​删除共享内存需要函数shmctl调用IPC_RMID命令来完成。

4、int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmid:共享内存区标识;        

cmd:对共享内存的操作命令,命令IPC_RMID销毁(destroy)一片共享内存,销毁之后所有shmat,shmdt,shmctl对该片内存 操作都将失效,销毁该共享内存要等到该共享内存引用计数变为0才进行;IPC_SET命令设置shmid_ds结构成员;IPC_STAT返回当前共享内 存结构;其余命令查看man手册。        

buf:为指向shmid_ds数据结构。

posted @ 2016-11-27 14:26  luizp  阅读(201)  评论(0编辑  收藏  举报