Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1136223
  • 博文数量: 646
  • 博客积分: 288
  • 博客等级: 二等列兵
  • 技术积分: 5375
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-08 14:33
个人简介

为了技术,我不会停下学习的脚步,我相信我还能走二十年。

文章分类

全部博文(646)

文章存档

2014年(8)

2013年(134)

2012年(504)

分类:

2012-07-03 15:37:43

原文地址:共享内存 作者:Jiker4836

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问。
#include
void *mmap(void *addr,size_t len,int prot,int flags,int fd, off_t offset)
fd:即将映射到进程空间的文件描述字,一般由open()返回。
len:是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起
prot:指定共享内存的访问权限。PROT-READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行),PROT_NONE(不可访问)
offset:一般设为0,表示从文件头开始映射。
addr:指定文件应该被映射到进程空间的地址。
函数的返回值是最后文件映射的到进程空间的地址,进程可直接操作起始地址为改制的 有效地址。
 
munmap()该调用在进程地址空间中接触一个映射关系,当映射关系解除后,堆原来映射地址的访问将导致段错误发生
int munmap(void *addr,size_t len)
addr:是调用mmap()时返回的地址。
len:是映射区的大小。
 
munmap()进程在映射空间的对共享内容的改变并不直接协会磁盘文件中,往往调用munmap()后才执行。
int munmap(void *addr,size_t len,int flags)
addr:是调用mmap()时返回的地址
len:是映射区的大小
flages:是写回的动作细节设置
 
 
 
system V共享内存:通过shmget()获得或创建一个IPC共享区域,并返回相应的标识符,然后调用系统调用shmat()完成将该共享内存区域映射到进程地址空间。
shmget()该系统调用获得或新建一个共享内存区域,调用成功返回该区域的ID即shmid若出错返回-1.
intshmget(key_t key,size_t size,int flag)
key:为IPC结构的键值,通常取IPC_PRIVATE
size:为该共享区域的长度,新建一个区域要指定size大小,引用原有的size为0
flag:为权限位。
 
shmat()该系统调用将shmget返回的区域映射到进程的内存空间中。
void *shmat(int shmid,const void *addr,int flag)
shmid:为通过shmget得到的内存区域的ID
addr:表示将内存区域映射到调用进程的哪个地址上。如果addr为0,由内核选择可用的内存地址,如果addr不为0,且flag参数没有指定SHM_RND,则映射到addr所指定的地址上,如果addr非0,且flag参数指定的地址上(该地址是2的乘方,否则向下取最近的1个2的乘方的地址)
flag:长用选项:SHM_RDONLY指定只读方式映射共享内存,否则读写方式映射。
 
shmdt()解除共享内存区域与进程地址addr的映射关系
int shmdt(void *addr)
 
消息队列的事项包括触按键或打开消息队列、添加消息,读取消息和控制消息队列操作。
msgget()创建或打开一个消息队列
#include
#include
#include
int msgget(key_t key,int msgflg)
key:队列ID通常取IPC_PRIVATE
msgflg:可以IPC_CREAT/IPC_EXCL/IPC_NOWAIT
以下两种情况下该调用将创建一个新的消息队列:
如果没有消息队列与键值key相对应,并且msgflg中包含的IPC_CREAT标志位
key参数为IPC_PRIVATE
 
int msgsnd(int msgid,struct msgbuf *msgq,int msgsz,int msgflg)
调用成功返回0.否则返回-1,将发送的消息存储在msgp只想的msgbuf结构中,消息的大小msgze指定,msgbuf结构为消息的基本结构: struct msgbuf{
                                            long mtype;
                                            char mtext[1];
                                                        };
mtype:消息的类型
mtext消息的内容
msgflg为IPC_NOWAIT
 
msgrcv()该系统调用哪个从ID为msgid的消息队列中读取一个消息,并把消息存储在msgp只想的msgbuf结构中。
int msgrcv(int msgid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg);
调用成功返回实际的字节数,出错返回-1
msgid:消息队列ID
msgp:消息返回的存储地址
msgsz:指定msgbuf的mtext成员的长度
msgtyp:请求读取的消息类型
msgflg:读消息标志
IPC_NOWAIT:如果没有满足条件立即返回
IPC_EXCEPT:与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息
IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的msgse字节,则把该消息阶段,截断部分将丢失
 
msgctl()对由msqid标识的消息队列执行cmd操作
int msgctl(int msgid,int cmd ,ctruct msgid_ds *buf)
cmd操作有三种命令:IPC_STAT/IPC_SET/IPC_RMID
 
阅读(449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~