操作系统课程设计报告LINUX设计1478.pdf
《操作系统课程设计报告LINUX设计1478.pdf》由会员分享,可在线阅读,更多相关《操作系统课程设计报告LINUX设计1478.pdf(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 北京工业大学计算机学院 操作系统课程设计报告 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、.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 有关常量及相关错误信息的含义:(0007053
3、5 颜博 负责).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 代
4、码及注释.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
5、.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_m
6、sgsnd)以及与它相关的函数 sys_msgsnd,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例 25。颜博负责:分析消息的接收函数(real_msgrcv)以及与它相关的函数 sys_msgrcv,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。所占工作比例 25。李悦负责:分析消息队列的创建函数(sys_msgget)以及与它相关的函数 newque、findkey、msg_init,写出代码分析结果,并画出流程图来表示相关函数之间的相互调用关系。明确组内成员的明细分工,总体把握组内成员的进度。后期组织组内成员成果汇总进行本组总体报告撰写。
7、所占工作比例 25。2 LINUX 的消息函数主模块功能描述:Linux 采用消息队列的方式来实现消息传递。System V 的消息队列(message queues)是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息即在发送完消息后,发送方就可以从事其它工作了而接收方也不必一直等待消息。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。Linux 维护了一系列消息队列的msgque 向量表。其中的每一个单元都指向一个 msqid_ds 的数据
8、结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的 msqid_ds 的数据结构并插入到向量表中。每一个 msqid_ds 数据结构都包括一个 ipc_perm 的数据结构和进入这个队列的消息的指针。另外,Linux 保留队列的改动时间,例如上次队列写的时间等。Msqid_ds 队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm数据结构的模式比较。如果进程可以向这个队列写,则消息会从进程的地址空间写到 msg 数据结构,放到消息队列的最后。每一个消息都带有进程间约定的,应用
9、程序指定类型的标记。但是,因为 Linux 限制了可以写的消息的数量和长度,可能会没有空间容纳消息。这时,进程会被放到消息队列的写等待队列,然后调用调度程序选择一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。如果没有符合条件的消息,读进程操作系统课程设计 LINUX 的消息函数的分析 2 会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。3 LINUX 的消息函数各个子模块功能描述:
10、3.1 Msgget:(00070535 李悦 负责)功能:取得一个消息队列。调用者提供消息队列的键标(用于表示一个消息队列的唯一的名字),当这个队列存在的时候,这个系统调用负责返回这个队列的标识号;如果这个队列不存在,就创立一个消息队列,然后返回这个消息队列的标识号。主要由 sys_msgget执行。说明:系统调用返回与参数 key 相关的消息队列的标识符.若以下事实成立,则与消息队列相关的标识符和数据结构将被创建出来:.若参数 key 等于 IPC_PRIVATE.若参数 key 没有存在的消息队列标识符与之相关,同时(msgflg&IPC_CREAT)为真.创建消息队列的同时,与新的消息
11、队列标识符相关的数据结构将被初始化为如下:.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:(00
12、070518 白静谊 负责)功能:发送消息到指定的消息队列中。主要由 real_msgsnd 执行。说明:发送一个消息到由 msqid 指定消息队列标识号的消息队列.参数 msgp 指向一个用户定义的缓冲区,并且缓冲区的第一个域应为长整型,指定消息类型,其他数据放在缓冲区的消息中其他正文区内.下面是消息元素定义:long mtype;char mtext;mtype 是一个整数,用于接收进程选择消息类型.mtext 是一个长度为 msgsz 字节的任何正文,参数 msgsz 可从 0 到系统允许的最大值之间变化.msgflg 指定操作行为:.若(msgflg&IPC_NOWAIT)是真的,消息
13、并不是被立即发送而调用进程会立即返回.若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况之一发生:.消息被发送出去.消息队列标志被系统删除.系统调用返回-1.调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.调用成功后,对应指定的消息队列的相关结构做如下动作:.消息数(msg_qnum)加 1.操作系统课程设计 LINUX 的消息函数的分析 3 .消息队列最近发送进程号(msg_lspid)改为调用进程号.消息队列发送时间(msg_stime)改为当前系统时间.以上信息可用命令 ipcs-a 看到.返回值:发送成功则返回 0,否则返回-1.3.3 Msg
14、rcv:(00070532 颜博 负责)功能:用msgrcv函数系统调用从msqid消息队列中读取一条信息并将其放入消息段指针msgp指向的结构。msgsz 给出 mtext 的字节数,如果所接收的消息比 msgsz 大且msgflg&MSG_NOERROR 为真,则按 msgsz 的大小截断而不通知调用进程。从消息队列中取得指定类型的消息.。说明:系统调用从由 msqid 指定的消息队列中读取一个由 msgtyp 指定类型的消息到由 msgp指向的缓冲区中,同样的,该缓冲区的结构如前所述,包括消息类型和消息正文.msgsz 为可接收的消息正文的字节数.若接收到的消息正文的长度大于 msgsz
15、,则会被截短到msgsz 字节为止(当消息标志 msgflg&MSG_NOERROR 为真时),截掉的部份将被丢失,而且不通知消息发送进程.msgtyp 指定消息类型:.为 0 则接收消息队列中第一个消息.大于 0 则接收消息队列中第一个类型为 msgtyp 的消息.小于 0 则接收消息队列中第一个类型值不小于 msgtyp 绝对值且类型值又最小的消息.msgflg 指定操作行为:.若(msgflg&IPC_NOWAIT)是真的,调用进程会立即返回,若没有接收到消息则返回值为-1,error 设置为 ENOMSG.若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况
16、之一发生:.队列中的消息的类型是有效的.消息队列标志被系统删除.系统调用返回-1.调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.调用成功后,对应指定的消息队列的相关结构做如下动作:.消息数(msg_qnum)减 1.消息队列最近接收进程号(msg_lrpid)改为调用进程号.消息队列接收时间(msg_rtime)改为当前系统时间.以上信息可用命令 ipcs-a 看到.返回值:调用成功则返回值等于接收到实际消息正文的字节数.不成功则返回-1.3.4 Msgctl:(00070502 赵野 负责)功能:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等等操作
17、。主要由 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有合适权限的进程
18、操作.只有具有合适权限的用户才能增加 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
19、_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:指向消息
20、开头的指针;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:等待进入消息队列的消息队列;r
21、wait:如果在接收消息的时候没有可以接收的消息,那么根据这个设置来看是返回一个错误代码表示读消息失败还是阻塞等待消息到来;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:记录消
22、息被发送的时间;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;/已用的消息队
23、列数 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 memo
24、ry*/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(
25、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;/对等待消息队列的消息锁指针进行赋空,表示无消息锁 retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告 LINUX 设计 1478
限制150内