操作系统进程创立及通信试验报告_第1页
操作系统进程创立及通信试验报告_第2页
操作系统进程创立及通信试验报告_第3页
操作系统进程创立及通信试验报告_第4页
操作系统进程创立及通信试验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——操作系统进程创立及通信试验报告武汉工程大学

计算机科学与工程学院

《操作系统》试验报告[Ⅰ]

专业班级学生学号学生姓名计算机工程02班试验项目试验类别试验地点指导教师试验时间5号机房2023-12-13创立进程及进程通信操作性()验证性()设计性(√)综合性()其它()求

试验目的及要试验目的及要求:创立进程,实现消息通信和共享内存通信。了解进程的创立、退出和获取进程信息。把握通过内存印象文件和管道技术实现进程通信。成绩评定表类别上机表现评分标准积极出勤、遵守纪律认真完成试验任务程序代码规范、功能正确填写内容完整、表达收获分值30分得分报告质量70分合计说明:评阅教师:日期:2023年月日

一、试验目的

创立进程,实现消息通信和共享内存通信。了解进程的创立、退出和获取进程信息。把握通过内存印象文件和管道技术实现进程通信。

二、试验内容

本例用三种方法实现进程通信,仅用于例如目的,没有进行功能优化。

1、在进程A中输入一些字符,点“利用SendMessage发送消息〞按钮可将消息发到进程B。

2、在进程A中输入一些字符,点“写数据到内存映像文件〞按钮,然后在进程B中点“从内存映像文件读数据〞按钮可收到消息。

3、先在进程B中点“创立管道并接收数据〞按钮,然后在进程A中输入一些字符,点“写数据到管道文件〞按钮可将消息发到进程B。(重复第3步每次可发一条消息)

三、试验思想

这次试验基本思想是通过创立进程,实现进程间通信。主要通过将数据写到内存印象文件中和创立管道来实现进程通信。

用MFC创立一个父窗体程序A和一个子窗体程序B。在主窗体程序中添加一个创立子窗体的进程B按钮和一个终止这个子窗体的按钮。然后添加3个按钮,分别叫做“利用SendMessage发送消息〞、“写数据到内存印象文件〞、“写数据到管道文件〞,通过这3种方式来实现进程A和进程B之间的通信。

四、设计分析:

首先设计好父窗体和子窗体的整体面貌。然后编写各个功能模块。对于父窗体,在“利用SendMessage发送消息〞按钮的消息响应函数中,主要是利用WindowsAPI函数CWnd::FindWindow来找到接收消息的窗体,即进程B,找到进程B后,利用这个函数返回的窗体指针的SendMessage函数来发送消息。在“写数据到内存印象文件〞按钮的消息响应函数中,主要是利用函数CreateFileMapping来创立一个印象文件,这个函数返回的是这个印象文件的句柄,然后将这个句柄和要发送的消息字符串传递到函数sprintf中,就可以所要发送的消息写入印象文

件,在子窗体中有个“从内存印象文件读数据〞按钮,在这个按钮的消息响应函数中读取父进程所创立的印象文件中的数据就可以实现通信了。在父窗体按钮“写数据到管道文件〞的消息响应函数中,不能直接将要发送的消息发送到管道文件,由于管道必需先由子进程通过函数CreateNamedPipe创立,只有待子进程创立好管道后父进程才能根据管道创立管道文件,将消息写入管道文件并及时发送给子进程。而且这个管道只能使用一次,即每次发送完消息后那个管道不能在使用了,必需再由子进程创立一个管道,父进程才能再次创立管道文件并向其中写入消息。

五、程序部分源代码:

1.“利用SendMessage发送消息〞按钮中的主要代码//找到接收消息的窗口(窗口名为Receiver)CStringstr=\进程B\CWnd*pWnd=CWnd::FindWindow(NULL,str);if(pWnd){COPYDATASTRUCTbuf;char*s=newchar[m_Msg1.GetLength()];//m_Msg1为CString类型的变量s=m_Msg1.GetBuffer(0);buf.cbData=strlen(s)+1;buf.lpData=s;pWnd->SendMessage(WM_COPYDATA,0,(LPARAM)//传送大量数据要用WM_COPYDATA消息}

2.创立内存映像对象主要代码HANDLEhMapping;LPSTRlpData;

hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,\if(hMapping==NULL){

AfxMessageBox(\return;}

//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指

lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);if(lpData==NULL){

AfxMessageBox(\return;}

//给这段映像内存写数据

sprintf(lpData,m_Msg1);

//释放映像内存

UnmapViewOfFile(lpData);

3.利用管道发送消息的主要代码客户端:

#include

#definePIPE_NAME\

voidmain(void){

HANDLEPipeHandle;DWORDBytesWritten;

if(WaitNamedPipe(PIPE_NAME,NMPWAIT_WAIT_FOREVER)==0){

printf(\GetLastError());return;}

//Createthenamedpipefilehandle//总是这里出错?????

if((PipeHandle=CreateFile(PIPE_NAME,GENERIC_READ|GENERIC_WRITE,0,

(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,

(HANDLE)NULL))==INVALID_HANDLE_VALUE){

printf(\return;}

if(WriteFile(PipeHandle,\NULL)==0){

printf(\CloseHandle(PipeHandle);return;}

printf(\

CloseHandle(PipeHandle);}

服务器端:

DWORDWINAPIPipeInstanceProc(LPVOIDlpParameter){

HANDLEPipeHandle;DWORDBytesRead;DWORDBytesWritten;CHARBuffer[256];staticinti;

if((PipeHandle=CreateNamedPipe(\

PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,

NUM_PIPES,1024,1024,2000,NULL))==INVALID_HANDLE_VALUE){

printf(\GetLastError());return0;}

//Serveclientconnectionsforeverwhile(1){

if(ConnectNamedPipe(PipeHandle,NULL)==0){

printf(\GetLastError());break;}

//Readdatafromandechodatatotheclientuntil//theclientisreadytostop

while(ReadFile(PipeHandle,Buffer,sizeof(Buffer),

break;}}

if(DisconnectNamedPipe(PipeHandle)==0){

printf(\GetLastError());break;}}

CloseHandle(PipeHandle);return0;}

六、测试用例:

运行进程A,点击“创立进程B按钮〞,创立一个进程B

(1)在进程A的静态文本框中输入“123〞,点击“利用SendMessage发送消息〞按钮,可以在进程B中收到这个消息,运行结果如下图所示:

图1

图2

(2)在进程A的静态文本框中输入“456〞,点击“写数据到内存印象文件〞按钮,在进程B中点击“从内存印象文件读数据〞,将收到这个消息,运行结果如下图所示:

图3

图4

(3)在进程A的静态文本框中输入“789〞,点击“写数据到管道文件〞按钮,将会发生错误,运行结果如下图所示:

图5

主要原因是进程B没有创立管道,点击进程B的“创立管道并接受数据〞,然后再在进程A中发送数据到管道文件,进程B就能接收到消息,运行举国如下图所示:

图6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论