加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux网络编程之System V 共享内存和系列函数

发布时间:2013-09-14 21:39:22 所属栏目:Linux 来源:站长网
导读:跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */ size_t shm_segsz; /* S
跟消息队列一样,共享内存也有自己的数据结构,如下:

struct shmid_ds {

struct ipc_perm shm_perm;    /* Ownership and permissions */

size_t     shm_segsz;   /* Size of segment (bytes) */

time_t     shm_atime;   /* Last attach time */

time_t     shm_dtime;   /* Last detach time */

time_t     shm_ctime;   /* Last change time */

pid_t     shm_cpid;    /* PID of creator */

pid_t     shm_lpid;    /* PID of last shmat(2)/shmdt(2) */

shmatt_t     shm_nattch;  /* No. of current attaches */

...

};

同样地,第一个成员是共有的IPC内核数据结构,其余是私有成员。

以下是几个共享内存函数 :

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);

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

int shmdt(const void *shmaddr);

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

功能:用来创建共享内存

原型 int shmget(key_t key, size_t size, int shmflg);

参数

key:这个共享内存段名字

size:共享内存大小

shmflg:由 九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的

返回值:成功返回一个非负整数,即该共享 内存段的标识码;失败返回-1

功能:将共享内存段连接到进程地址空间

原型

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

参数

shmid: 共享内存标识

shmaddr:指定连接的地址

shmflg:它的两个可能取值 是SHM_RND和SHM_RDONLY

返回值:成功返回一个指针,指向共享内存第一个字节;失败返回-1

shmaddr为NULL,核 心自动选择一个地址

shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。

shmaddr不为NULL且shmflg 设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。

公式:shmaddr - (shmaddr % SHMLBA)

shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

功能:将共享内存段与当前进程脱离

原型 int shmdt (const void *shmaddr);

参数

shmaddr: 由shmat所返回的指针

返回值:成功返回0;失败返回-1

注意:将共享 内存段与当前进程脱离不等于删除共享内存段

功能:用于控制共享内存

原型 int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数

shmid:由shmget返回的共享内存标识码

cmd:将要采取的动作(有三个可取值)

buf:指向一个保存着共享内存的模式状态和访问权限的数据结构

返回值:成功返回0;失败返回-1

cmd 的取值 如下,与消息队列类似:

IPC_STAT 把shmid_ds结构中的数据设置为共享内存的当前关联值

IPC_SET 在进程有足 够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值

IPC_RMID 删除共享内存段

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读