《linux共享内存专题编程笔记》由会员分享,可在线阅读,更多相关《linux共享内存专题编程笔记(9页珍藏版)》请在金锄头文库上搜索。
1、linux共享内存1共享内存基本概念共享内存q 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。用管道或者消息队列传递数据q 内核为每个IPC对象维护一个数据结构用共享内存传递数据2System V共享内存API共享内存数据结构及基本API struct shmid_ds struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes)
2、*/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 */.;共享内存函数 q #include q #include q int shmg
3、et(key_t key, size_t size, int shmflg);q void *shmat(int shmid, const void *shmaddr, int shmflg);q int shmdt(const void *shmaddr);q int shmctl(int shmid, int cmd, struct shmid_ds *buf);shmget函数q 功能:用来创建共享内存q 原型q int shmget(key_t key, size_t size, int shmflg);q 参数q key:这个共享内存段名字q size:共享内存大小q shmflg:
4、由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的q 返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1shmat函数q 功能:将共享内存段连接到进程地址空间q 原型q void *shmat(int shmid, const void *shmaddr, int shmflg);q 参数q shmid: 共享内存标识q shmaddr:指定连接的地址q shmflg:它的两个可能取值是SHM_RND和SHM_RDONLYq 返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1shmat函数(续)q shmaddr为NULL,核心自动选择一个地址q
5、 shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。q shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr - (shmaddr % SHMLBA)q shmflg=SHM_RDONLY,表示连接操作用来只读共享内存shmdt函数q 功能:将共享内存段与当前进程脱离q 原型q int shmdt(const void *shmaddr);q 参数q shmaddr: 由shmat所返回的指针q 返回值:成功返回0;失败返回-1q 注意:将共享内存段与当前进程脱离不等于
6、删除共享内存段shmctl函数q 功能:用于控制共享内存q 原型q int shmctl(int shmid, int cmd, struct shmid_ds *buf);q 参数q shmid:由shmget返回的共享内存标识码q cmd:将要采取的动作(有三个可取值)q buf:指向一个保存着共享内存的模式状态和访问权限的数据结构q 返回值:成功返回0;失败返回-1shmctl函数(续)3共享内存API示例共享内存查看工具及共享内存命令/key shmid owner perms bytes nattch status /0x00002234 131073 wbm01 666 68 0
7、/ int main(int argc, char *argv)int ret = 0;int shmid;/相当于打开文件,文件不存shmid = shmget(0x2234, sizeof(Teacher), IPC_CREAT | 0666); if (shmid = -1)perror(shmget err);return errno;printf(shmid:%d n, shmid);Teacher *p = NULL;p = shmat(shmid, NULL, 0);if (p = (void *)-1 )perror(shmget err);return errno;strcp
8、y(p-name, aaaa);p-age = 33;shmdt(p);printf(键入1 删除共享内存,其他不删除n);int num;scanf(%d, &num);if (num = 1)ret = shmctl(shmid, IPC_RMID, NULL);if (ret name);printf(age:%d n, p-age);shmdt(p);/key shmid owner perms bytes nattch status /0x00002234 131073 wbm01 666 68 0 / printf(键入1 程序暂停,其他退出n);int num;scanf(%d, &num);if (num = 1)pause(); return 0;