黄冈师范学院。
课程设计报告。
课程名称:计算机操作系统。
设计题目: linux的消息函数的分析。
院系: 计算机科学与技术学院
专业软件工程。
班级0701
姓名: 张旺,李浩,范兴一。
日期: 2023年10月11日。
指导教师张瑞红。
成绩。目录。
第一章课程设计简介 1
1. 本课程设计题目 1
2. 本课程设计要求及任务 1
3. 课程设计相关工具 2
4. 相关系统调用功能简介 2
5. 小组成员组成和分工 3
第二章消息函数的原理分析 4
第三章消息函数的子模块分析 5
消息的发送) 5
消息的接收和处理) 7
消息队列的获取) 8
消息队列的控制) 9
第四章消息函数的数据结构分析 10
1. 数据结构分析 10
2. 数据结构分析图 11
第五章消息函数**分析和流程图 12
源**分析 12
2.消息函数引用的源** 15
3. 消息函数流程图 16
第六章课程设计心得体会 18
第七章致谢 19
第八章参考文献 19
linux的消息函数的分析;
要求: 理解linux中消息函数:msgget, msgsnd, msgrcv以及msgctl,并且很好的掌握消息函数的算法思想,数据结构,函数的执行过程,能够熟练的掌握并应用。
通过对linux的消息传递**的分析,了解linux操作系统中用于消息传递的msgget、msgsnd、msgrcv、msgctl的执行过程,锻炼分析大型软件**的能力。通过与同组同学的合作,锻炼团体合作能力。
任务:1、分析消息队列的控制函数(sys_msgctl)以及与它相关的函数freeque,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。
2、分析消息的发送函数(real_msgsnd)以及与它相关的函数sys_msgsnd,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。
3、分析消息的接收函数(real_msgrcv)以及与它相关的函数sys_msgrcv,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。
4、分析消息队列的创建函数(sys_msgget)以及与它相关的函数newque、findkey、msg_init,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。
1] **分析工具:win tc
2] 流程图分析工具:microsoft visio
与消息队列相关的消息函数有四个:
1) msgget:调用者提供一个消息队列的键标(用于表示一个消息队列的唯一的名字),当这个队列存在的时候,这个系统调用负责返回这个队列的标识号;如果这个队列不存在,就创立一个消息队列,然后返回这个消息队列的标识号。msgget所得到的不是一个消息,而是唯一标识一个消息队列的标识号。
主要由sys_msgget执行。
2)msgsnd:向一个消息队列发送一个消息。主要由real_msgsnd执行。
3)msgrcv:从一个消息队列中收到一个消息。主要由real_msgrcv执行。
4)msgctl:在消息队列上执行一组管理操作——根据参数的不同和权限的不同,可以检索。
关于它的限制的信息(比如队列所允许的最大消息数据量)、删除一个队列,等等。主要由sys_msgctl执行。
小组成员:李浩(组长),范兴一,张旺。
分工: 李浩 (200726240134)负责:分析消息队列的控制函数(sys_msgctl),(real_msgsnd)用法以及框图,写出**分析。
范兴一 (200926240132)负责:分析消息的接收函数(real_msgrcv)以及与它相关的函数sys_msgrcv和框图,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。。
张旺 (200726240133) 负责:分析消息队列的创建函数(sys_msgget)以及与它相关的函数newque、findkey、msg_init,写出**分析结果,并画出流程图来表示相关函数之间的相互调用关系。明确组内成员的明细分工,总体把握组内成员的进度。
后期组织组内成员成果汇总进行本组总体报告撰写。
linux采用消息队列的方式来实现消息传递。system v的消息队列(message queues)是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息——即在发送完消息后,发送方就可以从事其它工作了——而接收方也不必一直等待消息。
新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。linux维护了一系列消息队列的msgque向量表。
其中的每一个单元都指向一个msqid_ds的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的msqid_ds的数据结构并插入到向量表中。
每一个msqid_ds数据结构都包括一个ipc_perm的数据结构和进入这个队列的消息的指针。另外,linux保留队列的改动时间,例如上次队列写的时间等。msqid_ds队列也包括两个等待队列:
一个用于向消息队列写,另一个用于读。
每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm数据结构的模式比较。如果进程可以向这个队列写,则消息会从进程的地址空间写到msg数据结构,放到消息队列的最后。每一个消息都带有进程间约定的,应用程序指定类型的标记。
但是,因为linux限制了可以写的消息的数量和长度,可能会没有空间容纳消息。这时,进程会被放到消息队列的写等待队列,然后调用调度程序选择一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。
从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。
如果没有符合条件的消息,读进程会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。
1).功能描述:
在消息队列上进行发送消息(由real_msgsnd执行)。为了发送消息,调用进程对消息队列必须有写权能。
2).用法:
#include
#include
#include
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 将消息送入消息队列。
参数: msqid:消息队列的识别码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下。
struct msgbuf {
long mtype; /消息类型,必须 > 0 */
char mtext[1]; 消息文本 */
msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数ipc_nowait合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1;当msgflg为0时,msgsnd()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。
3).返回说明:成功执行时,msgsnd()返回0, 失败后-1,errno被设为以下的某个值。
eacces:调用进程在消息队列上没有写权能,同时没有cap_ipc_owner权能;
eagain:由于消息队列的msg_qbytes的限制和msgflg中指定ipc_nowait标志,消息不能被发送;
efault:msgp指针指向的内存空间不可访问;
eidrm:消息队列已被删除;
eintr:等待消息队列空间可用时被信号中断;
操作系统课程设计1要点
操作系统原理。课程设计报告。题目 采用二级目录实现文件管理 所在学院。班级。学号。姓名。指导教师。2013年1月15日。目录。一 课程设计目的1 二 课题内容1 三 总体路线1 四 概要设计2 1.数据结构2 2.所使用函数及其功能3 五 详细设计4 1.主函数流程图4 2.创建文件函数流程图5 3...
操作系统课程设计报告 1
操作系统原理课程设计。院系。班级学号。姓名。同组成员。指导教师。2014 年 1 月 13 日。操作系统原理课程设计任务书。一 题目 银行家算法。二 设计要求。1 组长 负责设计与实现,定义全局变量,签名函数和主函数以及显示分配情况函数showdata 负责设计与实现系统初始化函数chushihua...
操作系统课程设计2 1
目录。1 设计目的 1 2 设计内容 1 3 设计步骤 1 3.1 开发平台 1 3.1.1 开发环境介绍 1 3.1.2 开发界面截图 2 3.2 详细设计 2 3.2.1 算法说明 2 3.2.2 系统流程图 4 3.3 运行与测试 4 3.3.1 运行测试 4 3.3.2 异常处理测试 7 3...