欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦——西电计科课程学习

实验4:匿名管道通信

一、实验目的

  学习使用匿名管道在两个进程间建立通信。

二、实验内容

  父进程创建一个匿名管道,在父子进程间建立通信。

三、程序框架

   父进程:

   先建一个Parent的单文档应用程序,增加“创建管道”“读取数据”“写入数据”三个菜单。

   添加消息响应函数OnPipeCreate(),OnPipeRead(),OnPipeWrite()。在CParentView类中增加成员变量HANDLE类型的hRead,hWrite,初始化变量,并在析构函数中释放句柄:

void CParentView::OnPipeWrite()
{if(!CreatePipe(…))  /*创建匿名管道*/{/*显示消息“创建管道失败!”*//*退出*/}if(!CreateProcess(…))  /*创建子进程*/{/*关闭句柄hRead、hWrite*//*显示消息“创建子进程失败!”*//*退出*/}
}void CParentView::OnPipeRead()
{/*定义一个字符数组,用于存放读取的数据*/if(!ReadFile(…))  /*读取数据*/{/*显示消息“读取数据失败!”*//*退出*/}/*打印读取的数据*//*退出*/
}void CParentView::OnPipeWrite()
{/*定义一个字符数组,用于存放写入的数据*/if(!WriteFile(…)) /*写入数据*/{/*显示消息“写入数据失败!”*//*退出*/}
}

   子进程:

   建一个Child的单文档,在CChildView中增加两个成员HANDLE型的成员变量hRead,hWrite,并添加消息响应函数OnPipeRead(),OnPipeWrite(),再添加虚函数OnInitialUpdate(),并在析构函数中释放句柄:

void CChildView::OnInitialUpdate()
{hRead=GetStdHandle(…)/*获取标准输入句柄*/hWrite=GetStdHandle(…)/*获取标准输出句柄*/
}void CParentView::OnPipeRead()
{/*定义一个字符数组,用于存放读取的数据*/if(!ReadFile(…))  /*读取数据*/{/*显示消息“读取数据失败!”*//*退出*/}/*打印读取的数据*//*退出*/
}void CParentView::OnPipeWrite()
{/*定义一个字符数组,用于存放写入的数据*/if(!WriteFile(…)) /*写入数据*/{/*显示消息“写入数据失败!”*//*退出*/}
}

  创建匿名管道:

BOOL CreatePipe(        //创建匿名管道PHANDLE hReadPipe,                       // read handlePHANDLE hWritePipe,                      // write handleLPSECURITY_ATTRIBUTES lpPipeAttributes,  // security attributesDWORD nSize                              // pipe size
);

  创建子进程:

BOOL CreateProcess(    //创建子进程LPCTSTR lpApplicationName,                 // name of executable moduleLPTSTR lpCommandLine,                      // command line stringLPSECURITY_ATTRIBUTES lpProcessAttributes, // SDLPSECURITY_ATTRIBUTES lpThreadAttributes,  // SDBOOL bInheritHandles,                      // handle inheritance optionDWORD dwCreationFlags,                     // creation flagsLPVOID lpEnvironment,                      // new environment blockLPCTSTR lpCurrentDirectory,                // current directory nameLPSTARTUPINFO lpStartupInfo,               // startup informationLPPROCESS_INFORMATION lpProcessInformation // process information
);

四、源代码

  父进程消息响应函数:

void CParentView::OnPipeCreate()
{// TODO: Add your command handler code here//TODO: Add your command handler code hereSECURITY_ATTRIBUTES sa;sa.bInheritHandle=TRUE;sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(SECURITY_ATTRIBUTES);if(!CreatePipe(&hRead,&hWrite,&sa,0)){MessageBox("创建匿名管道失败!");return;}STARTUPINFO sui;PROCESS_INFORMATION pi;ZeroMemory(&sui,sizeof(STARTUPINFO));sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USESTDHANDLES;sui.hStdInput=hRead;sui.hStdOutput=hWrite;sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);if(!CreateProcess("C:\\Users\\HP\\Desktop\\OS实验\\实验4 匿名管道通信\\Child\\Debug\\Child.exe",NULL,NULL,NULL,TRUE,0,NULL,NULL,&sui,&pi)){CloseHandle(hRead);CloseHandle(hWrite);hRead=NULL;hWrite=NULL;MessageBox("创建子进程失败!");return;}else{CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}
}
void CParentView::OnReadPipe()
{// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){MessageBox("读取数据失败!");return;}MessageBox(buf);
}
void CParentView::OnWritePipe()
{// TODO: Add your command handler code herechar buf[]="I AM A XDUER.";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){MessageBox("写入数据失败!");return;}
}

  子进程消息响应函数:

void CChildView::OnPipeRead()
{// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){MessageBox("读取数据失败!");return;}MessageBox(buf);
}
void CChildView::OnPipeWrite()
{// TODO: Add your command handler code herechar buf[]="这是一个匿名管道测试程序!";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){MessageBox("写入数据失败!");return;}
}

五、程序运行结果

西电操作系统上机实验4相关推荐

  1. 西电操作系统上机实验2

    欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习 实验2:线程共享进程数据 一.实验目的   1.学习创建线程实现多工作同步运行;   2.了解线程与进程之间的数 ...

  2. 西电操作系统上机实验3

    欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习 实验3:信号通信 一.实验目的   利用信号通信机制在父子进程及兄弟进程间进行通信. 二.实验内容   父进程创 ...

  3. 西电操作系统上机实验1

    欢迎各位学弟学妹收藏操作系统上机详解,大家有空也可以看看这篇文章哦--西电计科课程学习. 实验1:创建进程 一.实验目的   学会通过基本的Windows进程控制函数,由父进程创建子进程. 二.实验内 ...

  4. 西电操作系统上机实验6

    实验6:共享主存实现进程通信 一.实验目的   进程同步是操作系统多进程/多线程并发执行的关键之一,进程同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系. ...

  5. 西电 操作系统课设 在Ubuntu18.04安装pintos

    西电 操作系统课设 在Ubuntu18.04安装pintos 前言 1. 主要步骤 2. VMware的安装 3. Ubuntu18.04的安装和配置 4. Bochs的安装 4. Pintos安装 ...

  6. 西电-数据可视化-实验五-高维非空间数据可视化(pyecharts)

    西电-数据可视化-实验五-高维非空间数据可视化 一.实验内容 在某次大型会议中,为确保会议过程安全,会场使用了电子胸牌对场内人员的移动轨迹进行了监控.现经过处理,得到了某一天内人员在场内各个区域逗留的 ...

  7. 大学操作系统上机实验

      上机实验指导书 课程名称 操作系统 主撰人  刘天波 审核人  栾方军 沈阳建筑大学信息学院 2014 年3月 课程名称:操作系统 上机学时:16 适用专业:计算机科学与技术 先修课程:C语言 一 ...

  8. 西电计算机组装实验报告,西电模电实验报告(共7篇).docx

    西电模电实验报告(共7篇) 姓名:学号: 生命科学技术学院实验报告小组成员: 实验名称: 实验报告内容基本要求: 一.实验目的:二.实验材料和仪器设备:三.实验基本原理及步骤:四.实验数据记录和结果分 ...

  9. 西电数据结构上机题目-删除单链表中介于min与max之间的结点

    希望学长的代码能给大二西电er们带来帮助(大家一定要好好学习数据结构,合理利用资源) 大家找到了什么bug或有什么改进意见可以私信我或在下方留言,我都会看的 不多说废话直接上代码 #include&l ...

最新文章

  1. UA MATH 571B 回归 QE练习题 一元线性回归理论
  2. U2L蔚然成风,曙光为什么能抢了VMware的风头?
  3. python中文件位置的书写
  4. style 放入css文件失效_React中使用CSS的7种方式
  5. Java基础-TreeSet与Java自定义类型的排序
  6. 安装成功配置环境变量_go语言学习笔记-Windows10开发环境安装和环境变量配置
  7. JAVA——JVM参数设置规则以及参数含义
  8. ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#
  9. 网络攻防|一次实战中的向日葵 RCE Bypass 360
  10. 请用android手机自带浏览器,还在用手机自带浏览器吗?推荐两款无广告、功能齐全的浏览器...
  11. sqli-labs(50-53)
  12. 谁是 GameFi 3 月最大的赢家| March Monthly Report
  13. Vue 作者尤雨溪,引路中国程序开发
  14. 如何将py文件转化为exe
  15. 尚硅谷外卖项目笔记一
  16. 删除文件后清空了回收站要怎么恢复
  17. 解决win10下localhost打不开的问题
  18. 确定性网络:从“尽力而为”到“确定承诺”
  19. vue生命周期与vue请求
  20. 隐私加密系列|Grin与BEAM之间技术公开对比

热门文章

  1. linkedin android,LinkedIn领英(com.linkedin.android) - 6.0.126 - 应用 - 酷安
  2. Delphi 7启动后出错的解决办法
  3. java完全开源免费的word转pdf组件有哪些
  4. Docker 进阶之镜像分层详解
  5. SpringBoot+Vue实现的高校图书馆管理系统 附带详细运行指导视频
  6. idea没有jar包、maven没有dependencies、external libraries没有maven jar、libraries没有maven jar依赖
  7. 传搜狐将以搜狗为代价 变身360第一大股东
  8. 用python爬取网易云评论10w+的歌曲名_Python爬取网易云音乐评论热门歌曲和ID
  9. 黑色星期五 Friday The Thirteenth
  10. 2022年危险化学品经营单位安全管理人员考试模拟100题模拟考试平台操作