ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:45.18KB ,
资源ID:18987215      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18987215.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(西电计算机操作系统进程通信Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

西电计算机操作系统进程通信Word文档格式.docx

1、2 总体设计管道一先由父进程创建一个匿名管道,再由父进程获得读写句柄,构建读写的方式;由父进程创建子进程,实现父进程一样的通信功能。管道二二、详细实现1、父进程的实现1)消息以及成员函数和成员变量的声明public: afx_msg void OnBnClickedBtnCreatePipe(); /创建匿名管道 afx_msg void OnBnClickedBtnWritePipe(); /写匿名管道 afx_msg void OnBnClickedBtnReadPipe(); /读匿名管道 void ParentReadPipe(void); /定义父进程读匿名管道的成员函数 void

2、ParentWritePipe(void); /定义父进程写匿名管道的成员函数 void CreateSecurityAttributes(PSECURITY_ATTRIBUTES pSa); /创建 SECURITY_ATTRIBUTES 结构的成员函数 void CreateStartUpInfo(LPSTARTUPINFO lpStartUpInfo); /创建 STARTUPINFO 结构的成员函数 void CreateNoNamedPipe(void); /创建匿名管道的成员函数 /分别代表要从匿名管道中读的数据和要写到匿名管道中的数据 CString m_CStrReadPipe

3、; CString m_CStrWritePipe; /保存创建匿名管道后所得到的对匿名管道的读写句柄 HANDLE hPipeRead; HANDLE hPipeWrite; /保证匿名管道只创建一次BOOL m_PipeIsCreated;2)消息处理函数/创建匿名管道按钮的消息处理函数void CNoNamedPipeParentDlg:OnBnClickedBtnCreatePipe() if(m_PipeIsCreated = FALSE) this-CreateNoNamedPipe(); /写入数据到匿名管道中按钮的消息处理函数OnBnClickedBtnWritePipe()P

4、arentWritePipe();/从匿名管道中读取数据按钮的消息处理函数OnBnClickedBtnReadPipe()ParentReadPipe();/接收数据ParentReadPipe(void);/发送数据ParentWritePipe(void)/创建 SECURITY_ATTRIBUTES 结构CreateSecurityAttributes(PSECURITY_ATTRIBUTES pSa) /这里必须将 bInheritHandle 设置为 TRUE, /从而使得子进程可以继承父进程创建的匿名管道的句柄 pSa-bInheritHandle = TRUE;lpSecurit

5、yDescriptor = NULL;nLength = sizeof(SECURITY_ATTRIBUTES);/用来初始化新进程的 STARTUPINFO 成员CreateStartUpInfo(LPSTARTUPINFO lpStartUpInfo)/创建匿名管道CreateNoNamedPipe(void);2、子进程的实现1)消息以及成员函数和成员变量的声明:protected: HICON m_hIcon; / 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQuery

6、DragIcon(); DECLARE_MESSAGE_MAP() /保存从父进程得到针对于匿名管道的读写句柄 /子进程读取匿名管道 void ChildReadPipe(void); /子进程写匿名管道 void ChildWritePipe(void); /子进程获取从父进程处继承得到的关于匿名管道的读写句柄 void GetReadWriteHandleFromParent(void); /只需要获取一次匿名管道的读写句柄即可 BOOL m_IsGettedParentHandle;/往匿名管道中写入数据按钮的消息处理函数void CNoNamedPipeChildDlg: /如果子进程

7、还没有获得对匿名管道的读写句柄的话需要先获取句柄GetReadWriteHandleFromParent(); ChildWritePipe(); ChildReadPipe();/从匿名管道读取数据成员函数ChildReadPipe(void);/往匿名管道中写入数据ChildWritePipe(void)/需要获取继承自父进程的匿名管道读写句柄GetReadWriteHandleFromParent(void) if(this-m_IsGettedParentHandle = FALSE) hPipeRead = GetStdHandle(STD_INPUT_HANDLE); hPipeW

8、rite = GetStdHandle(STD_OUTPUT_HANDLE);m_IsGettedParentHandle = TRUE;三、实验结果启动父进程可执行文件,并单击创建匿名管道按钮,此时会弹出子进程窗口(新建了进程):再在父进程的左边文本框中输入数据,单击写入数据按钮:再在子进程窗口中单击读取数据按钮四、心得体会通过本次试验,更深入的了解了进程间通信中使用管道通信的方法,这种方法只能在父子进程之间通信,不能使用在其他地方,但在本地通信之间效率很高。六、附录1、父进程const int dataLength = 100;CNoNamedPipeParentDlg:CNoNamedP

9、ipeParentDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CNoNamedPipeParentDlg:IDD, pParent) , m_CStrReadPipe(_T() m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); m_PipeIsCreated = FALSE;DoDataExchange(CDataExchange* pDX) CDialogEx:DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_WRITE_PIPE, m_CStrWritePipe); DD

10、X_Text(pDX, IDC_EDIT_READ_PIPE, m_CStrReadPipe);BEGIN_MESSAGE_MAP(CNoNamedPipeParentDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_CREATE_PIPE, &OnBnClickedBtnCreatePipe) ON_BN_CLICKED(IDC_BTN_WRITE_PIPE, OnBnClickedBtnWritePipe) ON_BN_CLICKED(IDC_BTN_READ_PIPE, OnBnClicke

11、dBtnReadPipe)END_MESSAGE_MAP()ParentReadPipe(void) DWORD dwRead; char * pReadBuf; CString cStrRecvData; pReadBuf = new chardataLength; memset(pReadBuf, 0, dataLength); if(!ReadFile(hPipeRead, pReadBuf, dataLength, &dwRead, NULL) MessageBox(TEXT( 从匿名管道接收数据失败 .), TEXT(提示), MB_ICONERROR); return; cStrR

12、ecvData = 从匿名管道接收数据成功: ; cStrRecvData += pReadBuf;m_CStrReadPipe.Empty();m_CStrReadPipe = pReadBuf; UpdateData(FALSE); MessageBox(cStrRecvData, TEXT(), MB_ICONINFORMATION); UpdateData();this-m_CStrWritePipe.IsEmpty() char * pSendData; DWORD dwWrite; CString cStrSendData; /在这里需要将 Unicode 字符集转换为 ASCII

13、 字符集 pSendData = new charthis-m_CStrWritePipe.GetLength() + 1; memset(pSendData, 0, this-m_CStrWritePipe.GetLength() + 1); for(int i=0;im_CStrWritePipe.GetAt(i);WriteFile(hPipeWrite, pSendData, m_CStrWritePipe.GetLength() + 1, &dwWrite, NULL) 给匿名管道发送数据失败 . cStrSendData = 给匿名管道发送数据成功: cStrSendData +=

14、 this-m_CStrWritePipe;m_CStrWritePipe.Empty(); MessageBox(cStrSendData, TEXT( else 请先输入要发送给匿名管道的数据 . memset(lpStartUpInfo, 0, sizeof(STARTUPINFO); lpStartUpInfo-cb = sizeof(STARTUPINFO);dwFlags = STARTF_USESTDHANDLES; /子进程的标准输入句柄为父进程管道的读数据句柄hStdInput = hPipeRead; /子进程的标准输出句柄为父进程管道的写数据句柄hStdOutput =

15、hPipeWrite; /子进程的标准错误处理句柄和父进程的标准错误处理句柄一致hStdError = GetStdHandle(STD_ERROR_HANDLE);CreateNoNamedPipe(void) SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION processInfo; STARTUPINFO startUpInfo; CreateSecurityAttributes(&sa);CreatePipe(&hPipeRead, &hPipeWrite, &sa, 0) 创建匿名管道失败 . CreateStartUpInfo(&startUp

16、Info);CreateProcess(TEXT(NoNamedPipeChild.exe NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, startUpInfo, &processInfo) CloseHandle(hPipeRead); CloseHandle(hPipeWrite); hPipeWrite = NULL; hPipeRead = NULL; 创建子进程失败 . m_PipeIsCreated = TRUE; /对于 processInfo.hProcess 和 processInfo.hThread /这两个句柄不需要使用,所以释放资源 CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread);2、子程序/ 实现CNoNamedPipeChildDlg:CNoNamedPipeChildDlg(CWnd* pParent /*=NULL*/) CDialogEx(CNoNamedPipeChildDlg: , m_CStrWritePipe(_T(m_IsGettedParentHandle = FALSE; DDX_Text(pDX, IDC_EDIT_WRITE_PIPE, m_CStrWri

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1