Linux编程常用的函数(五) 共享内存
来源:互联网 发布:手机淘宝评价不能晒图 编辑:程序博客网 时间:2024/05/15 00:47
(五)共享内存
1.内核为每个共享内存设置了一个 shmid_ds结构,它的成员如下:
Struct shmid_ds{
struct ipc_perm shm_perm; //操作权限结构
size_t shm_segsz; //用字节表示的段的长度
pid_t shm_lpid; //最后一个操作的进程ID
pid_t shm_cpid; //创建者的进程ID
shmatt_t shm_nattch //当前连接的进程数量
time_t shm_atime; //最后一次调用shmat的时间
time_t shm_dtime; //最后一次调用shmdt的时间
time_t shm_ctime; //最后一次调用shmtl的时间
。
。
}
2.include<sys/shm.h> int shmget(key_t key, size_t size, int flag);//创建共享内存
size指的是共享内存段的格式n*sizeof(int)则共享内存段将用来存储int类型数据n个
成功返回一个对应于共享内存段标识符的非负整数,不成功返回-1并设置errno,错误码:
EACCES key的共享标识符存在,但没有授予相关的权限
EEXIST key的共享标识符存在,但((shmflg&IPC_CREAT) && (shmflg&IPC_EXCL)!=0
EINVAL 要创建共享内存段,但size是无效的
EINVAL 没有共享内存段要创建,但size与系统设置的限制或与key所代表的共享段的长度不相符
ENOENT key的共享内存表示符不存在,但(shmflg&IPC_CREAT)== 0
ENOMEM 没有足够的内存空间来创建指定的共享内存段
ENOSPC 要超出系统范围内对共享标识符的限制了
功能:
shmget函数返回一个与参数key相关的共享内存段标识符。
如果键位IPC_CREAT或者shmflg&IPC_CREAT非零,而且没有共享内存段或标识符与key相关联,函数就创建这个段,共享内存段被初始化为零。
3. int shmctl(int shmid, int cmd, struct shmid_ds *buf);//共享内存的控制
成功返回0,不成功返回-1并设置errno,错误码:
EACCES cmd为IPC_STAT,但是调用程序没有读权限
EINVAL shmid或cmd的值无效
EPERM cmd为IPC_RMID或IPC_SET,调用程序没有正确的权限
cmd值:
IPC_RMID 删除共享内存段,并销毁相应的shmid_ds
IPC_SET 用buf中的值来设置共享内存段shmid的字段值
IPC_STAT 将共享内存段shmid中的当前值拷贝到buf中去
IPC_LOCK 将共享内存段锁定在内存中(只有超级用户可以执行)
IPC_UNLOCK 解锁共享内存
4.void *shmat(int shmid, const void *shmaddr, int shmflg);//共享内存段的连接
成功返回内存段的起始地址,不成功shmat返回-1并设置errno,必须检测的错误码:
EACCES 调用程序的操作权限别否定
EINVLA shmid和shmaddr的无效
EMFILE 连接到进程上的共享内存段的树木超出了限制
ENOMEM 进程数据空间不足以容纳共享内存段
功能:
函数将shmid指定的共享内存段连接到调用进程的地址空间,并为shmid增加shm_nattch的值。
如果shmaddr为0,则此段连接到由内核选择的第一个可用的地址上
如果shmaddr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上
如果shmaddr非0,并且指定了SHM_RND,则此段连接到(addr-(addr mod ulus SHMLBA))所表示的地址上。
5. int shmdt(const void *shmaddr);//分离共享内存
成功返回0,不成功返回-1并设置errno,错误码:
EINVAL shmaddr不对应于共享内存段的起始地址
功能:
用完一个共享内存,调用其来分离共享内存段,并对shm_nattch进行减操作。
最后一个分离共享内存段的进程应该通过调用shmctl来释放共享内存段
1.内核为每个共享内存设置了一个 shmid_ds结构,它的成员如下:
Struct shmid_ds{
struct ipc_perm shm_perm; //操作权限结构
size_t shm_segsz; //用字节表示的段的长度
pid_t shm_lpid; //最后一个操作的进程ID
pid_t shm_cpid; //创建者的进程ID
shmatt_t shm_nattch //当前连接的进程数量
time_t shm_atime; //最后一次调用shmat的时间
time_t shm_dtime; //最后一次调用shmdt的时间
time_t shm_ctime; //最后一次调用shmtl的时间
。
。
}
2.include<sys/shm.h> int shmget(key_t key, size_t size, int flag);//创建共享内存
size指的是共享内存段的格式n*sizeof(int)则共享内存段将用来存储int类型数据n个
成功返回一个对应于共享内存段标识符的非负整数,不成功返回-1并设置errno,错误码:
EACCES key的共享标识符存在,但没有授予相关的权限
EEXIST key的共享标识符存在,但((shmflg&IPC_CREAT) && (shmflg&IPC_EXCL)!=0
EINVAL 要创建共享内存段,但size是无效的
EINVAL 没有共享内存段要创建,但size与系统设置的限制或与key所代表的共享段的长度不相符
ENOENT key的共享内存表示符不存在,但(shmflg&IPC_CREAT)== 0
ENOMEM 没有足够的内存空间来创建指定的共享内存段
ENOSPC 要超出系统范围内对共享标识符的限制了
功能:
shmget函数返回一个与参数key相关的共享内存段标识符。
如果键位IPC_CREAT或者shmflg&IPC_CREAT非零,而且没有共享内存段或标识符与key相关联,函数就创建这个段,共享内存段被初始化为零。
3. int shmctl(int shmid, int cmd, struct shmid_ds *buf);//共享内存的控制
成功返回0,不成功返回-1并设置errno,错误码:
EACCES cmd为IPC_STAT,但是调用程序没有读权限
EINVAL shmid或cmd的值无效
EPERM cmd为IPC_RMID或IPC_SET,调用程序没有正确的权限
cmd值:
IPC_RMID 删除共享内存段,并销毁相应的shmid_ds
IPC_SET 用buf中的值来设置共享内存段shmid的字段值
IPC_STAT 将共享内存段shmid中的当前值拷贝到buf中去
IPC_LOCK 将共享内存段锁定在内存中(只有超级用户可以执行)
IPC_UNLOCK 解锁共享内存
4.void *shmat(int shmid, const void *shmaddr, int shmflg);//共享内存段的连接
成功返回内存段的起始地址,不成功shmat返回-1并设置errno,必须检测的错误码:
EACCES 调用程序的操作权限别否定
EINVLA shmid和shmaddr的无效
EMFILE 连接到进程上的共享内存段的树木超出了限制
ENOMEM 进程数据空间不足以容纳共享内存段
功能:
函数将shmid指定的共享内存段连接到调用进程的地址空间,并为shmid增加shm_nattch的值。
如果shmaddr为0,则此段连接到由内核选择的第一个可用的地址上
如果shmaddr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上
如果shmaddr非0,并且指定了SHM_RND,则此段连接到(addr-(addr mod ulus SHMLBA))所表示的地址上。
5. int shmdt(const void *shmaddr);//分离共享内存
成功返回0,不成功返回-1并设置errno,错误码:
EINVAL shmaddr不对应于共享内存段的起始地址
功能:
用完一个共享内存,调用其来分离共享内存段,并对shm_nattch进行减操作。
最后一个分离共享内存段的进程应该通过调用shmctl来释放共享内存段
- Linux编程常用的函数(五) 共享内存
- linux系统编程——共享内存函数的使用方法
- 共享内存的常用函数原理剖析
- 共享内存的常用函数原理剖析
- 共享内存的常用函数原理剖析
- Linux 编程 共享内存
- Linux 编程 共享内存
- Linux 共享内存编程
- Linux编程实践----共享内存的演示(IPC)
- linux下C的共享内存编程
- linux网络编程之共享内存简介和mmap 函数
- linux网络编程之POSIX 共享内存和 系列函数
- linux网络编程之共享内存简介和mmap 函数
- 我的并行计算之路(五)Pthreads共享内存编程
- linux 进程间的通信(五) 共享内存-1
- linux 进程间的通信(五) 共享内存-2
- Linux环境进程间通信系列(五):共享内存
- Linux环境进程间通信(五): 共享内存
- Apache2.2 & Tomcat6.×整合方案(原创)
- Linux编程常用的函数(四) 信号量
- Ghost 使用详解
- Spring笔记之六(IoC Singleton) 单例的使用与否
- 说说大型高并发高负载网站的系统架构(个人评论)
- Linux编程常用的函数(五) 共享内存
- struts学习中遇到的小问题及解决方案
- 徐静蕾代言“英纳格”的十大不合理
- Break 与continue
- 冒险岛里不合逻辑的地方
- VIM + CTags/CScope
- 个人博客忧化与盈利,博客能赚多少钱?
- Linux编程常用的函数(六) PGSQL编程
- Google AdSense申请指南