欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    操作系统课程设计报告LINUX设计1478.pdf

    • 资源ID:83556740       资源大小:1.56MB        全文页数:34页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统课程设计报告LINUX设计1478.pdf

    北京工业大学计算机学院 操作系统课程设计报告 LINUX 的 消 息 函 数 的 分 析 小组成员:00070535 李悦(组长)00070502 赵野 00070518 白静谊 00070532 颜博 报告提交日期:2003 年 1 月 14 日 操作系统课程设计 LINUX 的消息函数的分析 i 目录 1 课设简介:.1 1.1 课程设计题目.1 1.2 课程设计小组成员.1 1.3 小组成员任务分配情况及每人所占工作比例.1 2 LINUX 的消息函数主模块功能描述:.1 3 LINUX 的消息函数各个子模块功能描述:.2 3.1 Msgget:(00070535 李悦 负责).2 3.2 Msgsnd:(00070518 白静谊 负责).2 3.3 Msgrcv:(00070532 颜博 负责).3 3.4 Msgctl:(00070502 赵野 负责).3 4 数据结构分析.4 4.1 数据结构图如下所示:.4 4.2 数据结构分析:.5 4.2.1 Struct msg:(00070502 赵野 负责).5 4.2.2 Struct msqid_ds:(00070532 颜博 负责).5 4.2.3 Msgque:(00070518 白静谊 负责).5 5 LINUX 的消息函数各个子模块相关函数代码分析结果.6 5.1 有关常量及相关错误信息的含义:(00070535 颜博 负责).6 5.1.1 常量含义:.6 5.1.2 错误信息含义.6 5.2 初始化函数 msg_init 函数的分析(00070535 李悦 负责).6 5.2.1 代码及注释.6 5.2.2 流程图.7 5.3 函数 sys_msgget 的分析 (00070535 李悦 负责).8 5.3.1 代码及注释.8 5.3.2 流程图.9 5.4 定位消息队列函数 findkey 的分析 (00070535 李悦 负责).10 5.4.1 代码及注释.10 5.4.2 流程图.11 5.5 创建消息队列函数 newque 的分析 (00070535 李悦 负责).11 5.5.1 代码及注释.11 5.5.2 流程图.13 5.6 发送消息函数 real_msgsnd 的分析(00070518 白静谊 负责).14 5.6.1 代码分析.14 5.5.2 流程图.17 5.7 接收消息函数 real_msgrcv 的分析 (00070532 颜博 负责).19 5.7.1 代码及注释.19 5.7.2 流程图:.22 5.8 函数 sys_msgctl 的分析 (00070502 赵野 负责).24 5.8.1 代码及注释.24 5.8.2 流程图.28 5.9 释放队列空间函数 freeque (00070502 赵野 负责).29 5.9.1 代码及注释.29 5.9.2 流程图.30 6 心得体会.31 参考文献:.31 相关工具:.31 操作系统课程设计 LINUX 的消息函数的分析 1 1 课设简介:1.1 课程设计题目 LINUX 的消息函数的分析 1.2 课程设计小组成员 赵野(00070502)、白静谊(00070518)、颜博(00070532)、李悦(组长)(00070535)1.3 小组成员任务分配情况及每人所占工作比例 赵野负责:分析消息队列的控制函数(sys_msgctl)以及与它相关的函数 freeque,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例 25。白静谊负责:分析消息的发送函数(real_msgsnd)以及与它相关的函数 sys_msgsnd,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例 25。颜博负责:分析消息的接收函数(real_msgrcv)以及与它相关的函数 sys_msgrcv,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例 25。李悦负责:分析消息队列的创建函数(sys_msgget)以及与它相关的函数 newque、findkey、msg_init,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。明确组内成员的明细分工,总体把握组内成员的进度。后期组织组内成员成果汇总进行本组总体报告撰写。所占工作比例 25。2 LINUX 的消息函数主模块功能描述:Linux 采用消息队列的方式来实现消息传递。System V 的消息队列(message queues)是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息即在发送完消息后,发送方就可以从事其它工作了而接收方也不必一直等待消息。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。Linux 维护了一系列消息队列的msgque 向量表。其中的每一个单元都指向一个 msqid_ds 的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的 msqid_ds 的数据结构并插入到向量表中。每一个 msqid_ds 数据结构都包括一个 ipc_perm 的数据结构和进入这个队列的消息的指针。另外,Linux 保留队列的改动时间,例如上次队列写的时间等。Msqid_ds 队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm数据结构的模式比较。如果进程可以向这个队列写,则消息会从进程的地址空间写到 msg 数据结构,放到消息队列的最后。每一个消息都带有进程间约定的,应用程序指定类型的标记。但是,因为 Linux 限制了可以写的消息的数量和长度,可能会没有空间容纳消息。这时,进程会被放到消息队列的写等待队列,然后调用调度程序选择一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。如果没有符合条件的消息,读进程操作系统课程设计 LINUX 的消息函数的分析 2 会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。3 LINUX 的消息函数各个子模块功能描述:3.1 Msgget:(00070535 李悦 负责)功能:取得一个消息队列。调用者提供消息队列的键标(用于表示一个消息队列的唯一的名字),当这个队列存在的时候,这个系统调用负责返回这个队列的标识号;如果这个队列不存在,就创立一个消息队列,然后返回这个消息队列的标识号。主要由 sys_msgget执行。说明:系统调用返回与参数 key 相关的消息队列的标识符.若以下事实成立,则与消息队列相关的标识符和数据结构将被创建出来:.若参数 key 等于 IPC_PRIVATE.若参数 key 没有存在的消息队列标识符与之相关,同时(msgflg&IPC_CREAT)为真.创建消息队列的同时,与新的消息队列标识符相关的数据结构将被初始化为如下:.msg_perm.cuid 和 msg_perm.uid 设置为调用进程的有效 UID.msg_perm.cgid 和 msg_perm.gid 设置为调用进程的有效 GID.msg_perm.mode 访问权限比特位设置为 msgflg 访问权限比特位.msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime 设置为 0.msg_ctime 设置为当前系统时间.msg_qbytes 设置为系统允许的最大值.返回值:调用成功则返回一个非 0 值,称为消息队列标识符;否则返回值为-1.3.2 Msgsnd:(00070518 白静谊 负责)功能:发送消息到指定的消息队列中。主要由 real_msgsnd 执行。说明:发送一个消息到由 msqid 指定消息队列标识号的消息队列.参数 msgp 指向一个用户定义的缓冲区,并且缓冲区的第一个域应为长整型,指定消息类型,其他数据放在缓冲区的消息中其他正文区内.下面是消息元素定义:long mtype;char mtext;mtype 是一个整数,用于接收进程选择消息类型.mtext 是一个长度为 msgsz 字节的任何正文,参数 msgsz 可从 0 到系统允许的最大值之间变化.msgflg 指定操作行为:.若(msgflg&IPC_NOWAIT)是真的,消息并不是被立即发送而调用进程会立即返回.若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况之一发生:.消息被发送出去.消息队列标志被系统删除.系统调用返回-1.调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.调用成功后,对应指定的消息队列的相关结构做如下动作:.消息数(msg_qnum)加 1.操作系统课程设计 LINUX 的消息函数的分析 3 .消息队列最近发送进程号(msg_lspid)改为调用进程号.消息队列发送时间(msg_stime)改为当前系统时间.以上信息可用命令 ipcs-a 看到.返回值:发送成功则返回 0,否则返回-1.3.3 Msgrcv:(00070532 颜博 负责)功能:用msgrcv函数系统调用从msqid消息队列中读取一条信息并将其放入消息段指针msgp指向的结构。msgsz 给出 mtext 的字节数,如果所接收的消息比 msgsz 大且msgflg&MSG_NOERROR 为真,则按 msgsz 的大小截断而不通知调用进程。从消息队列中取得指定类型的消息.。说明:系统调用从由 msqid 指定的消息队列中读取一个由 msgtyp 指定类型的消息到由 msgp指向的缓冲区中,同样的,该缓冲区的结构如前所述,包括消息类型和消息正文.msgsz 为可接收的消息正文的字节数.若接收到的消息正文的长度大于 msgsz,则会被截短到msgsz 字节为止(当消息标志 msgflg&MSG_NOERROR 为真时),截掉的部份将被丢失,而且不通知消息发送进程.msgtyp 指定消息类型:.为 0 则接收消息队列中第一个消息.大于 0 则接收消息队列中第一个类型为 msgtyp 的消息.小于 0 则接收消息队列中第一个类型值不小于 msgtyp 绝对值且类型值又最小的消息.msgflg 指定操作行为:.若(msgflg&IPC_NOWAIT)是真的,调用进程会立即返回,若没有接收到消息则返回值为-1,error 设置为 ENOMSG.若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况之一发生:.队列中的消息的类型是有效的.消息队列标志被系统删除.系统调用返回-1.调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.调用成功后,对应指定的消息队列的相关结构做如下动作:.消息数(msg_qnum)减 1.消息队列最近接收进程号(msg_lrpid)改为调用进程号.消息队列接收时间(msg_rtime)改为当前系统时间.以上信息可用命令 ipcs-a 看到.返回值:调用成功则返回值等于接收到实际消息正文的字节数.不成功则返回-1.3.4 Msgctl:(00070502 赵野 负责)功能:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等等操作。主要由 sys_msgctl 执行。说明:系统调用提供一系列消息控制操作,操作动作由 cmd 定义,以下 cmd 定义值表明了各操作动作的定义.IPC_STAT:将 msqid 相关的数据结构中各个元素的当前值放入由 buf 指向的结构中.IPC_SET:将msqid相关的数据结构中的下列各元素设置为由buf指向的结构中的对应值.msg_perm.uid 操作系统课程设计 LINUX 的消息函数的分析 4 msg_perm.gid msg_perm.mode msg_qbytes 该命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的进程或有效UID有合适权限的进程操作.只有具有合适权限的用户才能增加 msg_qbytes 的值.IPC_RMID:删除由 msqid 指示的消息队列.将它从系统中删除并破坏相关的数据结构.该命令只能由有效 UID 等于 msg_perm.cuid 或 msg_perm.uid 的进程或有效 UID 有合适权限的进程操作.返回值:调用成功则返回值为 0,否则为-1.4 数据结构分析 4.1 数据结构图如下所示:冯锐等译.LINUX 内核源代码分析.北京:机械工业出版社,2000.10 msgque IPC_UNUSED Msqid_ds IPC*msg_last*msg_first times*wwait*rwait Msg_qnum Msg Msg_type*msg_spot msg_stime Msg_ts Message*msg_next Msg_ts Msg*msg_next Msg_type*msg_spot msg_stime Msg_ts Message Msg_ts 消 息 队 列 数 据 结 构 图 操作系统课程设计 LINUX 的消息函数的分析 5 4.2 数据结构分析:4.2.1 Struct msg:(00070502 赵野 负责)代表一个在队列中等待的一个消息。它的成员如下:msg_next:指向队列中下一个消息的指针;msg_type:用户指定的消息类型编码;msg_spot:指向消息开头的指针;msg_stime:消息发送的时间;msg_ts:纪录消息的大小;4.2.2 Struct msqid_ds:(00070532 颜博 负责)代表一个消息队列。它的成员如下:msg_perm:表明那个进程可以读写这个消息队列;msg_first:指向队列中第一个消息的指针;msg_last:指向队列中最后一个消息的指针;msg_stime:纪录消息被送入队列的最后时间;msg_rtime:纪录从队列中读出消息的最后时间;msg_ctime:上一次改变队列的时间;(可以是队列创立的时间或者是上一次用 msgctl 系统调用来设置参数的时间。)wwait:等待进入消息队列的消息队列;rwait:如果在接收消息的时候没有可以接收的消息,那么根据这个设置来看是返回一个错误代码表示读消息失败还是阻塞等待消息到来;msg_cbytes:当前队列中消息的总字节数;msg_qnum:队列中消息的总数;msg_qbytes:队列中允许存储的消息的最大字节数;msg_lspid:最后消息发送方的 PID;msg_lrpid:最后消息接收方的 PID;4.2.3 Msgque:(00070518 白静谊 负责)代表在队列中等待的一个消息。它有如下成员:msg_next:指向队列中的下一个消息;msg_type:用户指定类型编码;msg_spot:指向消息内容的开头;msg_stime:记录消息被发送的时间;msg_ts:记录消息的大小容量;操作系统课程设计 LINUX 的消息函数的分析 6 5 LINUX 的消息函数各个子模块相关函数代码分析结果 5.1 有关常量及相关错误信息的含义:(00070535 颜博 负责)5.1.1 常量含义:static struct msqid_ds*msgqueMSGMNI;/消息队列 static int msgbytes=0;/消息队列中所有消息的总字节数 static int msghdrs=0;/消息队列的队头 static unsigned short msg_seq=0;static int used_queues=0;/已用的消息队列数 static int max_msqid=0;/消息队列最大的 ID 值 static struct wait_queue*msg_lock=NULL;/消息队列锁定,不让等待进程进入 5.1.2 错误信息含义 EINVAL 22/*Invalid argument*/EFAULT 14/*Bad address*/EIDRM 43/*Identifier removed*/EACCES 13/*Permission denied*/EAGAIN 11/*Try again*/EINTR 4/*Interrupted system call*/ENOMEM 12/*Out of memory*/E2BIG 7/*Arg list too long*/ENOMSG 42/*No message of desired type*/ENOSPC 28/*No space left on device*/ENOMEM 12/*Out of memory*/EPERM 1/*Operation not permitted*/ENOENT 2/*No such file or directory*/EEXIST 17/*File exists*/5.2 初始化函数 msg_init 函数的分析(00070535 李悦 负责)5.2.1 代码及注释 void _init msg_init(void)/*初始化消息队列*/int id;/*定义一个局部变量用于创建消息队列*/for(id=0;id MSGMNI;id+)/*循环对消息队列里的每一个消息进行初始化*/msgqueid=(struct msqid_ds*)IPC_UNUSED;/*初始化消息队列,把消息队列(msgque)的项目设置为 IPC_UNUSED*/操作系统课程设计 LINUX 的消息函数的分析 7 msgbytes=msghdrs=msg_seq=max_msqid=used_queues=0;/对每个变量进行初始化 msg_lock=NULL;/对等待消息队列的消息锁指针进行赋空,表示无消息锁 return;/返回 5.2.2 流程图 Process name:msg_initCompleted by:Li yueCompleted Data:2003.1.11.msg_init开始参数IDID msg_perm,msgflg)/如果当前消息队列指针指既没有向IPC_UNUSED 又没有指向 IPC_NOID,判断是否允许访问进程间通讯资源 IPC ret=-EACCES;/如果返回值非 0,则不允许访问进程间通讯资源 IPC,返回错误,错误类型 EACCES(Permission denied)else ret=(unsigned int)msq-msg_perm.seq*MSGMNI+id;/如果返回值 ID 为 0,则允许访问进程间通讯资源 IPC,序列编号和 msgque 下标被编码在返回值里。这个编号将成为调用者要传递给 sys_msgsnd、sys_msgrcv,以及 sys_msgctl 的 msgid 参数。unlock_kernel();/释放内核 return ret;/返回 ret 值 操作系统课程设计 LINUX 的消息函数的分析 9 5.3.2 流程图 SYS_MSGGET 开始Lock_kernel 锁内核 参数 KEY调用的参数中指明了IPC_PRIVATE吗?KEY=IPC_PRIVATE?是那么就表示需要建立一个新的队列,就直接调用newque 函数来创建一个新的消息队列。否调用 findkey 用参数ID 获得 findkey 的返回值参数 ID调 用 fin d k e y 的 返 回 值ID 判断是否有这一个键值指定的队列?ID=-1?否判断 msgflg 是否设置了 IPC_CREAT位是是出 错 类 型ENOENT否调用 newque 函数来 创 建 一 个 新 的消息队列。判断 msgflg 是否设置了 IPC_CREAT 和IPC_EXCL 位是出 错 类 型EEXIST否把参数ID所指明的队列号赋给当前的消息队列当前消息队列是否被设置 IPC_UNUSED或IPC_NOID?是该 地 方 没 有 消 息 队 列(msgque)或者调用者缺少访问它的权限返 回 错 误,错 误 类 型EACCES否判 断 是 否 允 许 访 问进程间通讯资源IPC否不 允 许 访 问 进 程间通讯资源 IPC返 回 错 误,错 误类型 EACCES是获得消息队列(msgque)的数组下标unlock_kernel 释放内核返回参数retProcess name:sys_msggetCompleted by:Li yueCompleted Data:2003.1.11.获 得 消 息 队 列 ID 的 函 数 sys_msgget 流 程 图 操作系统课程设计 LINUX 的消息函数的分析 10 5.4 定位消息队列函数 findkey 的分析 (00070535 李悦 负责)5.4.1 代码及注释 static int findkey(key_t key)/定位具有给定键值的消息队列 int id;struct msqid_ds*msq;for(id=0;id msg_perm.key)/判断键值是否匹配 return id;/如果匹配的键值被找到,则返回相应的数组下标 return-1;/循环结束,但是仍然未找到相互匹配的键值,则返回值1 以表示失败 操作系统课程设计 LINUX 的消息函数的分析 11 5.4.2 流程图 Process name:findkeyCompleted by:Li yueCompleted Data:2003.1.11.判断当前数组元素值是否是IPC_NOID即msq=msgqueid)=IPC_NOID?否这个新创建的消息队列可能具有正在被搜索的键值,调用interruptible_sleep_on函数使findkey函数等待该队列的创建工作完成Findkey开始参数IDID msg_perm.key?是返回键值相匹配的数组下标否否匹配失败返回1 定 位 具 有 给 定 键 值 的 消 息 队 列 函 数 findkey 流 程 图 5.5 创建消息队列函数 newque 的分析 (00070535 李悦 负责)5.5.1 代码及注释 static int newque(key_t key,int msgflg)/定位一个没有使用的 msgque 项,并尝试在那里创建一个新的消息队列 操作系统课程设计 LINUX 的消息函数的分析 12 int id;/*定义一个局部变量用于循环搜索消息队列*/struct msqid_ds*msq;struct ipc_perm*ipcp;for(id=0;id msg_perm;ipcp-mode=(msgflg&S_IRWXUGO);ipcp-key=key;ipcp-cuid=ipcp-uid=current-euid;ipcp-gid=ipcp-cgid=current-egid;msq-msg_perm.seq=msg_seq;msq-msg_first=msq-msg_last=NULL;msq-rwait=msq-wwait=NULL;msq-msg_cbytes=msq-msg_qnum=0;msq-msg_lspid=msq-msg_lrpid=0;msq-msg_stime=msq-msg_rtime=0;msq-msg_qbytes=MSGMNB;msq-msg_ctime=CURRENT_TIME;if(id max_msqid)/判断新队列是否建立在消息队列(msgque)中原来最高的已用单元槽之后 max_msqid=id;/如果这个新队列被建立在消息队列(msgque)中原来最高的已用单元槽之后,newque 就相应地增加 max_msqid msgqueid=msq;/在消息队列(msgque)里建立新队列 used_queues+;/被使用地队列计数器加一 wake_up(&msg_lock);/唤醒每个可能一直等在该队列初始化完成地 findkey return(unsigned int)msq-msg_perm.seq*MSGMNI+id;/返回序列编号和消息队列(msgque)的数组下标 操作系统课程设计 LINUX 的消息函数的分析 13 5.5.2 流程图 Process name:newqueCompleted by:Li yueCompleted Data:2003.1.11.newque开始参数IDID max_msqid?返回错误错 误 类 型ENOMEM消息队列被设置为IPC_UNUSED调用wake_up 一旦发现有IPC_NOID就激活任何已经休眠的findkey否是newque就相应 地 增 加max_msqid在消息队列里建立新队列并且被使用的队列计数器加一wake_up唤醒每个可能一直等在该队列初始化完成的findkey返回消息队列的数组下标 创 建 新 的 消 息 队 列 函 数 newque 流 程 图 操作系统课程设计 LINUX 的消息函数的分析 14 5.6 发送消息函数 real_msgsnd的分析(00070518 白静谊 负责)5.6.1 代码分析 static int real_msgsnd(int msqid,struct msgbuf*msgp,size_t msgsz,int msgflg)/实现sys_msgsnd 的实质内容 int id;struct msqid_ds*msq;struct ipc_perm*ipcp;/访问权限控制结构 struct msg*msgh;long mtype;if(msgsz MSGMAX|(long)msgsz 0|msqid mtype)return EFAULT(Bad address);if(mtype msg_perm;/对 IPC 进行赋值,进程间通讯权限允许 slept:if(msq-msg_perm.seq!=(unsigned int)msqid/MSGMNI)/判断保存在消息队列中的序列号是否和那个 msgque 参数里的编码相匹配 return-EIDRM;/如果保存在消息队列中的序列号不和那个 msgque 参数里的编码相匹配,则返回错误,错误类型 EIDRM(Identifier removed)if(ipcperms(ipcp,S_IWUGO)/判断调用者是否拥有写消息队列的权限 return-EACCES;/如果调用者没有写消息的权限,则返回错误,错误类型EACCES(Permission denied)if(msgsz+msq-msg_cbytes msq-msg_qbytes)/检查如果提供的消息被写入队列之后是否会超过队列所允许的最大容量 if(msgsz+msq-msg_cbytes msq-msg_qbytes)/检查如果提供的消息被写入队列操作系统课程设计 LINUX 的消息函数的分析 15 之后是否会超过队列所允许的最大容量 if(msgflg&IPC_NOWAIT)/队列中没有空间。判断 msgflg 里的 IPC_NOWAIT位是否被设置了 return-EAGAIN;/msgflg 里的 IPC_WAIT 位被设置了,调用者不用等待,返回错误,错误类型 EAGAIN(Try again)if(signal_pending(current)/调用 signal_pending 使进程进入休眠状态。首先判断是否有信号正在等待该进程 return-EINTR;/如果存在正在等待消息,就会用进程的休眠被信号中断的方式来处理它,返回错误,错误类型 EINTR(Interrupted system call)interruptible_sleep_on(&msq-wwait);/如果没有正在等待进程的信号,进程就进入休眠状态,直到有信号到达或一条消息移出队列时才被唤醒 goto slept;/当进程被唤醒之后,它将再次向队列写入 msgh=(struct msg*)kmalloc(sizeof(*msgh)+msgsz,GFP_KERNEL);/调用 kmalloc 函数为消息队列头(struct msg)和消息体分配足够的空间,消息体将紧接在消息头后面存发。消息头的msg_spot 直接指向该头部之后消息体开始的地发 if(!msgh)/判断是否分配成功 return-ENOMEM;/如果分配失败,返回错误,错误类型 ENOMEM(Out of memory)超出内存界限 msgh-msg_spot=(char*)(msgh+1);if(copy_from_user(msgh-msg_spot,msgp-mtext,msgsz)/调用 copy_from_user 函数从用户空间复制消息体 kfree(msgh);/调用 kfree 函数释放掉 msgh 的空间 return-EFAULT;/从用户空间复制消息体失败,/返回错误,错误类型 EFAULT(Bad address)if(msgqueid=IPC_UNUSED|msgqueid=IPC_NOID|msq-msg_perm.seq!=(unsigned int)msqid/MSGMNI)/检查消息队列的合法性 kfree(msgh);/调用 kfree 函数释放掉 msgh 的空间 return-EIDRM;/从用户空间复制消息体失败,/返回错误,错误类型 EIDRM(Identifier removed)/填写消息头,并将其入队,并更新队列自己相应的统计值 msgh-msg_next=NULL;/对头的下一个指针赋空 msgh-msg_ts=msgsz;/消息的大小 msgh-msg_type=mtype;/消息的类型 msgh-msg_stime=CURRENT_TIME;if(!msq-msg_first)/判断该消息队列是否就一个消息单元 操作系统课程设计 LINUX 的消息函数的分析 16 msq-msg_first=msq-msg_last=msgh;/如果该消息队列中就一个消息单元,则把指针 msg_first 与 msg_last 指向一块 else /如果消息消息队列不止一个消息单元,把当前消息单元添加到消息队列尾 msq-msg_last-msg_next=msgh;msq-msg_last=msgh;msq-msg_cbytes+=msgsz;msgbytes +=msgsz;/整个消息大小增加 msghdrs+;msq-msg_qnum+;/消息队列数加 1 msq-msg_lspid=current-pid;msq-msg_stime=CURRENT_TIME;wake_up(&msq-rwait);/唤醒所有等待消息到达这个队列的进程 return 0;/返回 0 表示发送成功 操作系统课程设计 LINUX 的消息函数的分析 17 5.5.2 流程图 Real_msgsnd开始参数msgsz判断消息的大小是否超过消息的最大值msgsz MSGMAX?是否判断调用 get_user 函数得到用户得消息类型mtype 是否成功否返回错误错误类型EINVAL返回错误错 误 类 型EFAULT是判断用户得消息类型是否合法 mtype 1?否是把消息队列的数组下标值赋给 ID,并通过ID得到要发送的消息队列判 断 当 前 待 发 送 的消 息 队 列 是 否 被 设置 IPC_UNUSED或IPC_NOID是把msq-msg_perm赋给IPCPslept:判断调用者是否拥有写消息队列的权限否返回错误错误类型EACCES否保存在消息队列中的序列号必须和那个msgque 参数里的编码相匹配否返回错误错 误 类 型EIDRM是Process name:real_msgsndCompleted by:Bai jing yiCompleted Data:2003.1.11.page 1 of 2是检查如果提供的消息被写入队列之后是否会超过队列所允许的最大容量是接下页b 否接下页a返回错误错误类型EINVAL返回错误错误类型EINVAL接下页c 操作系统课程设计 LINUX 的消息函数的分析 18 检查如果提供的消息被写入队列之后是否会超过队列所允许的最大容量Process name:real_msgsndCompleted by:Bai jing yiCompleted Data:2003.1.11.page 2 of 2接上页b是是队列中没有空间。判断msgflg里的IPC_NOWAIT 位是否被设置了是返回错误错误类型EAGAIN否调用signal_pending 函数使进程进入休眠状态。首先判断是否有信号正在等待该进程是返回错误错误类型EINTR否进程就进入休眠状态,直到有信号到达或一条消息移出队列时才被唤醒 goto slept;调用kmalloc函数为消息队列头和消息体分配足够的空间,消息体将紧接在消息头后面存发。消息头的msg_spot 直接指向该头部之后消息体开始的地方判断是否分配成功返回错误错误类型ENOMEM否调用copy_from_user 函数从用户空间复制消息体,并判断是否调用成功是是否调用kfree函数释放掉msgh的空间返回错误错 误 类 型EIDRM填写消息头,并将其入队,并更新队列自己相应的统计值判断该消息队列是否就一个消息单元把指针的对头与队尾指向一块是把消息单元添加到消息队列的尾部否更新消息队列相应的值发送成功返回0调用wake_up 函数唤醒所有等待消息到达这个队列的进程接上页slept处c否接上页a 消 息 的 发 送 函 数 real_msgsnd 流 程 图 操作系统课程设计 LINUX 的消息函数的分析 19 5.7 接收消息函数 real_msgrcv 的分析 (00070532 颜博 负责)5.7.1 代码及注释 static int real_msgrcv(int msqid,struct msgbuf*msgp,size_t msgsz,long msgtyp,int msgflg)/取消息函数,该函数为实际操作函数 struct msqid_ds*msq;/每个消息队列占一个 msqid_ds 结构,include/linux/msg.h/struct ipc_perm*ipcp;/访问权限控制结构 struct msg*tmsg,*leastp=NULL;/存放消息内容的结构体 struct msg*nmsg=NULL;/存放消息内容的结构体 int id;if(msqid 0|(long)msgsz msg_perm;/将消息的控制信息赋值给 ipcp /*find message of correct type./寻找正确类型的消息 *msgtyp=0=get first./取队列中第一个消息给 nmsg.*msgtyp 0=get first message of matching type./取队列中第一个消息给 nmsg.*msgtyp get message with least type must be msg_perm.seq!=(unsigned int)msqid/MSGMNI)return-EIDRM;if(ipcperms(ipcp,S_IRUGO)/判断该进程是否有权读取该消息队列 return-EACCES;if(msgtyp=0)/msgtyp 为 0 时取队列中第一条消息 nmsg=msq-msg_first;else if(msgtyp 0)/当 msgtyp 大于 0 时 if(msgflg&MSG_EXCEPT)/若标志字 msgflg 中设置了 MSG_EXCEPT 则进行如下操作 操作系统课程设计 LINUX 的消息函数的分析 20 for(tmsg=msq-msg_first;tmsg;tmsg=tmsg-msg_next)/初值为 tmsg=msq-msg_first,/当 t

    注意事项

    本文(操作系统课程设计报告LINUX设计1478.pdf)为本站会员(得****3)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开