曲径通幽论坛

标题: shmat, shmdt | 操作共享内存 [打印本页]

作者: beyes    时间: 2009-9-5 18:06
标题: shmat, shmdt | 操作共享内存
当首次创建共享内存段时,它并不能被任何进程所访问。为了使共享内存区可以被访问,则必须通过 shmat 函数将其附加( attach )到自己的进程空间中,这样进程就与共享内存建立了连接。该函数声明在 linux/shm.h中:
#include <sys/types.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);
参数 shmid 是 shmget() 的返回值,是个标识符;

参数 shmflg 是存取权限标志;如果为 0 ,则不设置任何限制权限。在 <bits/shm.h> 中定义了几个权限:
#define SHM_RDONLY      010000          /* attach read-only else read-write */
#define SHM_RND         020000          /* round attach address to SHMLBA */
#define SHM_REMAP       040000          /* take-over region on attach */
如果指定 SHM_RDONLY ,那么共享内存区只有读取权限。

参数 shmaddr 是共享内存的附加点,不同的取值有不同的含义:
shmat() 调用成功后返回一个指向共享内存区的指针,使用该指针就可以访问共享内存区了,如果失败则返回 -1。


当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。该函数声明在 sys/shm.h 中,其原型如下:
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
参数 shmaddr 是 shmat 函数的返回值。
进程脱离共享内存区后,数据结构 shmid_ds 中的 shm_nattch 就会减 1 。但是共享段内存依然存在,只有 shm_attch 为 0 后,即没有任何进程再使用该共享内存区,共享内存区才在内核中被删除。一般来说,当一个进程终止时,它所附加的共享内存区都会自动脱离。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2