




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统原理与Linux课程设计报告专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师 完成时间 2012年9月14日 成 绩 操作系统课程设计一、设计题目进程间通信模拟二、设计目的通过该题目的设计过程,了解了进程通讯的两种方式,管道通信以及消息通信。熟悉操作系统支持的进程通信方式三、设计要求(1)要求实现管道通信与消息通信两种方式.(2)要求界面简单,易懂,关键代码部分要注释.(3)编程语言可以采用自己任意精通的语言四、设计思想说明创建一个内存共享区,实现消息管道的进程间通讯。 五、系统结构的说明本程序是采用MFC框架所编写的win32应用程序 采用C+语言。六、数据结构的说明管道通
2、信定义了一个结构体,存放管道基础信息:struct PipeStruct/定义管道基础信息int UseProCount;/当前管道使用进程数,2表示已经在使用int BuffCount;/缓冲区有效数据长度BOOL isRecvOK;/接收完成标志 实现管道同步DWORD DataSender;/缓冲区数据的发送者,用来判断是不是接收到数据;消息通信:同样定义一个结构体,用来存放信息缓冲区的信息struct MsgBaseInfo/定义消息缓冲区基础信息bool isHaveMsg;/缓冲区是否有消息标志bool isBusy;/缓冲区是否正在使用 实现消息同步;struct MyMsgIn
3、foSYSTEMTIME msgTime;/消息产生时间char data256;/消息数据;七、程序清单:#include stdafx.h/进程通信消息机制模拟实现 实验版/Author: 广东石油化工学院 : 郑捷 朱晓标 王克俭 刘斌/Date: 2012-9-12/本文件功能: 实现基于共享内存消息机制通信模拟实验/#include stdafx.hstruct MsgBaseInfo/定义消息缓冲区基础信息bool isHaveMsg;/缓冲区是否有消息标志bool isBusy;/缓冲区是否正在使用 实现消息同步;struct MyMsgInfoSYSTEMTIME msgTim
4、e;/消息产生时间char data256;/消息数据;HANDLE hNowMsg;/共享内存句柄CList MsgList;/消息队列全局变量LPVOID pMsgBuff;/消息缓冲区extern int GetMsgToList();int InitMyMsg(char *MsgName) MsgList.RemoveAll();/初始化消息队列 SetLastError(0); /创建共享内存实现消息机制 0-0x1000存放消息缓冲区基础信息 0x1000-0x2000为消息缓冲区 hNowMsg = CreateFileMappingA(INVALID_HANDLE_VALUE,
5、0,PAGE_READWRITE,0,0x2000,MsgName); if (hNowMsg = NULL) return 2;/表示初始化失败 else if(GetLastError()=ERROR_ALREADY_EXISTS) return 3;/消息标示重复,已经被使用 pMsgBuff = MapViewOfFile(hNowMsg,FILE_MAP_ALL_ACCESS,0,0,0x2000); /将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射。 MsgBaseInfo mbi = ; mbi.isBusy =
6、false; mbi.isHaveMsg = false; memcpy(pMsgBuff,&mbi,sizeof(mbi); CreateThread(0,0,(LPTHREAD_START_ROUTINE)GetMsgToList,0,0,0); return 0;extern void AutoGetMsgToShow();int GetMsgToList()/从缓冲区获取消息到消息队列MsgBaseInfo *mbi = (MsgBaseInfo *)pMsgBuff;for(;true;)if(mbi-isHaveMsg)/判断缓冲区是否有消息MyMsgInfo *NewMsg =
7、new MyMsgInfo();memcpy(NewMsg,(char *)pMsgBuff+0x1000,sizeof(MyMsgInfo);MsgList.AddTail(*NewMsg);/把消息添加到队列尾mbi-isHaveMsg = false;delete NewMsg;AutoGetMsgToShow();Sleep(10);void AutoGetMsgToShow()/自动从消息队列获取消息显示到界面上面if(MsgList.GetCount()!=0)WCHAR data2000;DWORD size = 0;MyMsgInfo nowMsg = MsgList.Remo
8、veHead();/从队列头取出一个消息SYSTEMTIME time = nowMsg.msgTime;memcpy(data,nowMsg.data,256);CString timesr;timesr.Format(L%d-%d-%d %d:%d:%d,time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);m_dlg-meslist.InsertItem(0,L消息);m_dlg-meslist.SetItemText(0,1,timesr);m_dlg-meslist.SetItemText(0,2
9、,data);int SendMsg(char *MsgName,char *data)/发送消息函数 HANDLE hTmpMsg = OpenFileMappingA(FILE_MAP_ALL_ACCESS,0,MsgName); if(hTmpMsg=NULL) return -1;/消息标识符不存在,返回失败 LPVOID pTmpBuff = MapViewOfFile(hTmpMsg,FILE_MAP_ALL_ACCESS,0,0,0x2000); MsgBaseInfo *mbi = (MsgBaseInfo *)pTmpBuff; for(;mbi-isBusy!=false|
10、mbi-isHaveMsg!=false;)/等待其他发送进程完成消息发送,保持同步和互斥 Sleep(10); mbi-isBusy = true;/设置缓冲区被占用,保持互斥 MyMsgInfo AAMsg = ; GetLocalTime(&(AAMsg.msgTime); memcpy(AAMsg.data,data,256); memcpy(CHAR *)pTmpBuff+0x1000,&AAMsg,sizeof(AAMsg); mbi-isHaveMsg = true;/设置当前缓冲区为有消息 mbi-isBusy = false;/释放缓冲区使用权 UnmapViewOfFile
11、(pTmpBuff); CloseHandle(hTmpMsg); return 0;#include stdafx.hHANDLE hNowPipe = NULL;/管道内存区句柄LPVOID pPipeBuff = NULL;/管道内存区地址HANDLE hBusy;/读写操作信号量 实现管道互斥struct PipeStruct/定义管道基础信息int UseProCount;/当前管道使用进程数,2表示已经在使用int BuffCount;/缓冲区有效数据长度BOOL isRecvOK;/接收完成标志 实现管道同步DWORD DataSender;/缓冲区数据的发送者,用来判断是不是接
12、收到数据;int DisconnectPipe()/关闭管道PipeStruct * ppi = (PipeStruct *)pPipeBuff;CloseHandle(hBusy);ppi-UseProCount-;UnmapViewOfFile(pPipeBuff);CloseHandle(hNowPipe);return 0;void WaitForRecv()/等待接收完成 实现同步PipeStruct * ppi = (PipeStruct *)pPipeBuff;for(;ppi-isRecvOK=FALSE;)Sleep(100);extern void AutoGetPipe(
13、);int ConnectPipe(char * lpPipeName)/打开管道/创建共享内存区域以模拟实现管道功能,大小0x3000,其中0-0x1000是管道信息 0x1000-0x3000是管道传输缓冲区 单向管道hNowPipe = CreateFileMappingA(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,0x3000,lpPipeName);if (hNowPipe = NULL) return 2;/表示连接失败pPipeBuff = MapViewOfFile(hNowPipe,FILE_MAP_ALL_ACCESS,0,0,0x30
14、00);if (pPipeBuff = NULL) return 3;/还是失败PipeStruct * pipeInfo = (PipeStruct *)pPipeBuff;if(pipeInfo-UseProCount=0)PipeStruct NewPipeInfo = ;NewPipeInfo.UseProCount = 1;/设置管道使用数为1 表示等待另一个进程连接NewPipeInfo.isRecvOK = FALSE;hBusy = CreateMutexA(0,0,MyPipeMutx);/创建互斥当读写操作信号量memcpy(pPipeBuff,&NewPipeInfo,s
15、izeof(PipeStruct);CreateThread(0,0,(LPTHREAD_START_ROUTINE)AutoGetPipe,0,0,0);return 0;elseif(pipeInfo-UseProCount=2)/管道两头都已经在使用,不能再连接,关闭连接,返回失败DisconnectPipe();return 4;else/管道连接完成hBusy = OpenMutexA(MUTEX_ALL_ACCESS,0,MyPipeMutx);/打开互斥体句柄,在管道互斥时需要使用pipeInfo-UseProCount+;CreateThread(0,0,(LPTHREAD_S
16、TART_ROUTINE)AutoGetPipe,0,0,0);/创建自动处理线程return 1;return 0;int SendPipe(LPVOID data,int size)/发送数据到管道PipeStruct * pipe = (PipeStruct *)pPipeBuff;DWORD waitrez = WaitForSingleObject(hBusy,20000);/等待管道空闲,实现管道互斥GetLastError();if(waitrez=WAIT_OBJECT_0)/得到管道使用权pipe-isRecvOK = FALSE;memset(char *)pPipeBuf
17、f+0x1000,0,0x2000);memcpy(char *)pPipeBuff+0x1000,data,size);pipe-BuffCount = size;/设置缓冲区有效数据长度ReleaseMutex(hBusy);/释放管道使用权pipe-DataSender = GetCurrentProcessId();/设置管道数据为当前进程发送的WaitForRecv();/等到接收完成return 0;elsereturn 2;/返回失败,等待超时int RecvPipe(LPVOID data,DWORD* size)/从管道接收数据PipeStruct * pipe = (Pip
18、eStruct*)pPipeBuff;DWORD waitrez = WaitForSingleObject(hBusy,20000);if(waitrez=WAIT_OBJECT_0)/得到管道使用权memcpy(data,(char *)pPipeBuff+0x1000,pipe-BuffCount);*size = pipe-BuffCount;/返回成功读取的长度ReleaseMutex(hBusy);/释放管道使用权pipe-DataSender = 0;/设置管道没有数据pipe-isRecvOK = true;/设置接收完成return 0;/成功返回0elsereturn -1;/失败返回-1,等待超时bool isExitPipe = false;void AutoGetPipe()/自动从管道接收数据,并且显示到窗口上PipeStruct * pipe = (PipeStruct*)pPipeBuff;for(;isExitPipe=false;)if(pipe-DataSender!=0&pipe-DataSender!=GetCurrentProcessId()WCHAR data2000 = L;DWORD size = 0;RecvPipe(data,&size)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析美容师考试常见错误与公务员省考试题及答案
- 优化答题思路与方法2024年CPBA商业分析师试题及答案
- 小学语文考试心理素质培养的有效方式试题及答案
- 2024年公共事业管理自考内容梳理试题及答案
- 2024年食品质检员资格考试题库
- 美容师考试模拟试题及答案解析分享
- 糖尿病药物的分子机制试题及答案
- 成都语文八下试题及答案
- 商业分析师考试趋势分析试题及答案
- 关于2024年计算机基础考试的具体试题及答案
- 基础会计课件(完整版)
- 品质异常处罚细则及奖罚制度
- 二年级下册心理健康教案-第二十四课 帮爸爸妈妈分担 妈妈谢谢您|北师大版
- CT图像伪影及处理
- 诊所备案申请表格(卫健委备案)
- 人教PEP版五年级英语下册-《课时学练测》全册含答案
- 锅炉水冷壁安装作业指导书
- 《雷锋叔叔_你在哪里》说课稿
- 赞美诗歌400首全集
- 横向分布系数计算剖析
- 北京市建筑施工作业人员安全生产知识教育培训考核试卷A及答案知识讲解
评论
0/150
提交评论