操作系统实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统上机实验报告成绩教师:方敏2016年12月17日班级:1403018学号:140607815姓名:黄杨实验地点:E-Ⅲ区208实验时间:2016.10.13—2016.12.17实验一创建进程【实验软硬件环境】VC【实验内容】实验内容:父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理【实验原理】父进程创建子进程,实现多个进程并发执行,提高计算机的运行效率。【实验程序及分析】试验程序源代码如下:父进程部分代码://test1.cpp:Definestheentrypointfortheconsoleapplication.#includestdafx.h#includestdio.h#includestdlib.h#includewindows.hintmain(intargc,char*argv[]){STARTUPINFOsui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATIONpi;if(!CreateProcess(D:\\Test1\\test1\\test1zi.exe,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&sui,&pi)){printf(子进程创建失败,即将退出程序!\n);return0;}else{intsum=0;for(inti=1;i=100;i++){sum+=i;printf(sum=%d\n,sum);}}Sleep(3000);WaitForSingleObject(pi.hProcess,INFINITE);FILE*qp;if((qp=fopen(D:\\Test1\\abc.txt,r))==NULL){printf(读文件打开失败!\n);return0;}else{charch;while((ch=fgetc(qp))!=EOF){printf(%c,ch);}printf(\n);fclose(qp);}return0;}子进程部分代码://test1zi.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includestdio.h#includestdlib.h#includewindows.hintmain(intargc,char*argv[]){printf(已经创建子进程\n);FILE*fp;if((fp=fopen(D:\\Test1\\abc.txt,w))==NULL){printf(文件创建失败!\n);return0;}else{fprintf(fp,XiDianUniversity);fclose(fp);printf(数据已经写入成功\n);}FILE*qp;if((qp=fopen(D:\\Test1\\abc.txt,r))==NULL){printf(读文件打开失败!\n);return0;}else{charch;while((ch=fgetc(qp))!=EOF){printf(%c,ch);}printf(\n);fclose(qp);printf(数据读出成功\n);}Sleep(3000);return0;}【实验结果截图】父进程截图:子进程截图:【实验心得体会】第一次操作系统上机,遇到了很多为问题。在学长和学姐的耐心指导下,解决了所有存在的问题,顺利完成了上机题目。通过这次上机,掌握了父进程创建子进程的方法,对操作系统多线程的认识进一步加深。实验二进程共享进程数据【实验软硬件环境】VC【实验内容】在进程中定义全局共享数据,在线程中直接引用该数据进行更改并输出该数据。【实验原理】定义一个全局变量,主进程可他创建的线程均可以实现对全局变量的访问和修改。【实验程序及分析】程序代码如下://Test2.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includewindows.h#includestdio.hstaticintcount=10;DWORDWINAPIThreadProc(LPVOIDIpParameter){for(count=1;count=5;count++){printf(count=%d\n,count);}return0;}intmain(intargc,char*argv[]){printf(线程运行!\n);printf(count=%d\n,count);printf(新线程运行\n);HANDLEhThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);Sleep(5000);CloseHandle(hThread);printf(线程等待五秒钟!\n);printf(新线程结束!\n);printf(线程结束!\n);return0;}【实验结果截图】【实验心得体会】这次实验内实现了主线程和他创建的线程对共享数据的读取和修改操作,定义的全局变量是程序中的共享数据,线程对其均有访问和修改的权利。对线程间的共享数据有了初步认识。实验三信号通信【实验软硬件环境】VC++【实验内容】父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理。【实验程序及分析】父进程程序://Processs.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includeprocess.h#includewindows.hintmain(intargc,char*argv[]){HANDLEhinstance=CreateEvent(NULL,FALSE,FALSE,NewEvnet);STARTUPINFOsui;ZeroMemory(&sui,sizeof(sui));sui.cb=sizeof(STARTUPINFO);PROCESS_INFORMATIONpi;if(!CreateProcess(F:\\练习源代码\\c语言\\操作系统上机\\Test3\\ChildProcess\\Debug\\ChildProcess.exe,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&sui,&pi)){printf(failedtocreatechildprocess\n);}else{printf(WaitingforEvent\n);}if(WAIT_FAILED==WaitForSingleObject(hinstance,10000)){printf(waitfailed\n);}else{printf(GettheEvent\n);}}子进程程序://ChildProcess.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includeprocess.h#includewindows.hintmain(intargc,char*argv[]){HANDLEhinstance=OpenEvent(EVENT_ALL_ACCESS,false,NewEvent);Sleep(3000);printf(SignaltheeventtoParent?[y\\n]\n);charsignal;scanf(%c,&signal);if(signal=='y')SetEvent(hinstance);Sleep(3000);return0;}【实验结果截图】【实验心得体会】父进程创建子进程创建了一个有名事件,并且用来接收子进程发送的信号。通过这次实验对父子进程间的关系有了更多的认识,掌握了一些父子进程间的通信方法。实验四匿名管道通信【实验软硬件环境】Vc++【实验内容】分别建立名为Parent的单文档应用程序和Child的单文档应用程序作为父子进程,由父进程创建一个匿名管道,实现父子进程向匿名管道写入和读取数据。【实验程序及分析】第四题的Fraim文件下,摘取主要内容:父进程的主要代码如下:voidCParentView::OnPipeCreate(){SECURITY_ATTRIBUTESsa;sa.bInheritHandle=TRUE;//子进程可以继承父进程创建的匿名管道的读写句柄sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&hRead,&hWrite,&sa,0)){AfxMessageBox(创建匿名管道失败!);return;}STARTUPINFOsui;PROCESS_INFORMATIONpi;ZeroMemory(&sui,sizeof(STARTUPINFO));sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USESTDHANDLES;//表示当前STARTUPINFO这个结构体变量中的标准输入、标准输出和标准错误句柄三个成员是有用的sui.hStdInput=hRead;//这里将子进程的标准输入和标准输出句柄分别设置为管道的读写句柄sui.hStdOutput=hWrite;sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);if(!CreateProcess(..\\Child\\Debug\\Child.exe,NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi)){CloseHandle(hRead);CloseHandle(hWrite);hRead=NULL;hWrite=NULL;AfxMessageBox(创建子进程失败!);return;}else{CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}}voidCParentView::OnPipeRead(){charbuf[100]={0};DWORDdwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){AfxMessageBox(读取数据失败!);return;}AfxMessageBox(buf);}voidCParentView::OnPipeWrite(){charbuf[]=父进程信息;DWORDdwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){AfxMessageBox(写入数据失败!);return;}}子进程的主要代码如下:voidCChildView::OnChildRead(){charbuf[100]={0};DWORDdwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){AfxMessageBox(读取数据失败!);return;}AfxMessageBox(buf);}voidCChildView::OnChildWrite(){charbuf[]=子进程信息;DWORDdwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){AfxMessageBox(写入数据失败!);return;}}【实验结果截图】本实验,在父进程的面板上,主要有创建管道,读,写,三个项目,子进程的项目上主要有读,写,两个管道。由于电脑上没有VC++,第四题的源程序截图没办法重现,附上PPt中的图片。【实验心得体会】匿名管道一般用于实现本

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功