linux 共享内存 shmat,shmget,shmdt,shmctl

shmget

int shmget(key_t key, size_t size, int flag);//开辟一段共享内存

key_t key :标识符的规则()

size_t size :共享内存的大小

int flag :读写的权限

返回值:成功返回一个贡献内存的id,失败返回 -1;

当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存。

size 要创建的贡献内存的长度,以页为最小到分配单元,PACE_SIZE=4096字节,即size = 1 时实际开辟的大小为4K

flag:

IPC_CREAT   如果共享内存不存在,则创建一个共享内存,否则打开操作。
IPC_EXCL    只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。

shmat
void *shmat(int shmid, const void *addr, int flag);//得到共享内存存储段的地址

int shmid :shmget()返回的存储段的id

void* addr:一般为0,表示连接到由内核选择的第一个可用地址上,否则,如果flag没有指定SHM_RND,则连接到addr所指定的地址上,如果flag为SHM_RND,则地址取整

int flag:一般为0

返回值:成功返回一个共性内存的存储段的地址。失败返回 -1

shmdt

int shmdt(void *addr);
addr:共享存储段的地址,以前调用shmat时的返回值
shmdt将使相关shmid_ds结构中的shm_nattch计数器值减1

当一个进程不再需要共享内存段时,它将调用shmdt()系统调用取消这个段,但是,这并不是从内核真正地删除这个段,而是把相关shmid_ds结构的 shm_nattch域的值减1,当这个值为0时,内核才从物理上删除这个共享段

shmctl

int shmctl(int shmid,int cmd,struct shmid_ds *buf)
shmid:共享存储段的id
cmd:一些命令

IPC_STAT 得到共享内存的状态
        IPC_SET 改变共享内存的状态
        IPC_RMID 删除共享内存

IPC_RMID 命令实际上不从内核删除一个段,而是仅仅把这个段标记为删除,实际的删除发生在最后一个进程离开这个共享段时。 

注意,共享内存不会随着程序结束而自动消除,要么调用shmctl删除,

要么自己用手敲命令去删除,否则永远留在系统中。

上一篇:人物传记Daniel Bolsonaro:永远不要做一个思维单一的人


下一篇:Java基础之一组有用的类——使用Scanner对象(TryScanner)