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来释放共享内存段
 
原创粉丝点击