匿名管道 父子进程间通信
来源:互联网 发布:macbook如何删除软件 编辑:程序博客网 时间:2024/05/02 15:48
第一:匿名管道只能实现本地进程之间的通信,不能实现跨网络之间的进程间的通信。
第二:匿名管道只能实现父进程和子进程之间的通信,而不能实现任意两个本地进程之间的通信。
父子进程 又是一个双工程 DEBUG文件夹中将产生两个exe
运行的方式是运行 父.exe 然后父会在运行过程中调用子进程
在父工程view中 添加两个成员和三个菜单顶
private:HANDLE hWrite;HANDLE hRead;public:afx_msg void OnPipeCreate();afx_msg void OnPipeRead();afx_msg void OnPipeWrite();
CMy0630AView::CMy0630AView(){// TODO: add construction code herethis->hRead=NULL;this->hWrite=NULL;}CMy0630AView::~CMy0630AView(){if(this->hRead){::CloseHandle(this->hRead);}if(this->hWrite){::CloseHandle(this->hWrite);}}
void CMy0630AView::OnPipeCreate(){// TODO: Add your command handler code here/*typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle;} *//*typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId;}*/::SECURITY_ATTRIBUTES sa;sa.bInheritHandle=TRUE;//TRUE : 子进程可以继续父进程创建的匿名管道句柄sa.lpSecurityDescriptor=NULL;sa.nLength=sizeof(::SECURITY_ATTRIBUTES);if(!::CreatePipe(&this->hRead,&this->hWrite,&sa,0)){::AfxMessageBox("创建匿名管道失败..");return;}::STARTUPINFO sui;<span style="white-space:pre"></span>//内容很多的结构体::PROCESS_INFORMATION pi;ZeroMemory(&sui,sizeof(STARTUPINFO));//将sui中所有变量的随机值设置为0//其实本函数是memset(&sui,0,sizeof(STARTUPINFO));sui.cb=sizeof(STARTUPINFO);sui.dwFlags=STARTF_USESTDHANDLES;sui.hStdInput=this->hRead;//标准输入句柄sui.hStdOutput=this->hWrite;//标准输出句柄sui.hStdError=::GetStdHandle(STD_ERROR_HANDLE);//标准错误设备句柄if(!::CreateProcessA("./0701A-son.exe",NULL,//指定命令行参数NULL,//进程安全属性NULL,//线程安全属性TRUE,//父进程的打开句柄都被子进程继承0,//创建标示NULL,//让新进程使用父进程的环境NULL,//让子进程与父进程拥有同样的驱动器和路径&sui,//&pi)){::CloseHandle(this->hRead);::CloseHandle(this->hWrite);this->hRead=NULL;this->hWrite=NULL;::AfxMessageBox("创建子进程失败!");return;}else{::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);//如果CreateProcess成功 则关闭所返回的子进程的句柄和子进程中主线程的句柄}//当调用 CreateProcess函数 启动一个子进程时,它将继承父进程所有可继承的已打开的句柄//但子进程不知道哪一个是管道读句柄,哪一个是管道写句柄//为了让子进程从众多继承的句柄中分出管道的读,写句柄,就必须将子的特殊句柄设置为管道的读写句柄}向管道写与从管道读
void CMy0630AView::OnPipeRead(){// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!::ReadFile(this->hRead,buf,100,&dwRead,NULL)){::AfxMessageBox("读取数据失败!");return;}::AfxMessageBox(buf);}void CMy0630AView::OnPipeWrite(){// TODO: Add your command handler code herechar buf[]="http://www.baidu.com";DWORD dwWrite;if(!::WriteFile(this->hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){::AfxMessageBox("写入数据失败!");return;}}以下是子工程,同样,两成员三菜单
private:HANDLE hWrite;HANDLE hRead;public:afx_msg void OnPipeRead();afx_msg void OnPipeWrite();virtual void OnInitialUpdate();构造与析构函数
CMy0701AsonView::CMy0701AsonView(){// TODO: add construction code herethis->hRead=NULL;this->hWrite=NULL;}CMy0701AsonView::~CMy0701AsonView(){if(this->hRead){::CloseHandle(this->hRead);}if(this->hWrite){::CloseHandle(this->hWrite);}}在子工程中,少了创建管道,多了初始化虚函数
void CMy0701AsonView::OnInitialUpdate()//增加的虚函数{CView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base classthis->hRead=::GetStdHandle(STD_INPUT_HANDLE);this->hWrite=::GetStdHandle(STD_OUTPUT_HANDLE);}管道的写与读
void CMy0701AsonView::OnPipeRead(){// TODO: Add your command handler code herechar buf[100];DWORD dwRead;if(!ReadFile(hRead,buf,100,&dwRead,NULL)){::AfxMessageBox("读取数据失败!");return;}::AfxMessageBox(buf);}void CMy0701AsonView::OnPipeWrite(){// TODO: Add your command handler code herechar buf[]="此信息来自匿名管道测试程序子程序";DWORD dwWrite;if(!WriteFile(this->hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){::AfxMessageBox("写入数据失败!");return;}}
0 0
- 匿名管道 父子进程间通信
- Linux下父子进程匿名管道通信
- 匿名管道实现父子进程之间的通信....
- 进程间通信-匿名管道
- 进程间通信 - 匿名管道
- 进程间通信匿名管道
- 进程间通信-匿名管道
- 父子进程间的单向管道通信
- UNIX环境高级编程学习之第十五章进程间通信 - 通过半双工匿名管道实现父子进程通信
- 进程间通信:匿名管道通信
- 进程间通信之匿名管道通信
- 进程通信-匿名管道
- 进程通信 - 匿名管道
- UNIX环境高级编程学习之第十五章进程间通信 - 通过匿名管道实现父子进程同步
- 进程间通信之管道通信(匿名管道)
- 匿名管道--进程间的通信
- 进程间通信-匿名管道
- 通过匿名管道实现进程间通信
- 获取两个字符串所有公共的子串算法
- SAP EXCEL OLE常用方法和属性+例子
- Eclipse 一直Building Workspace 的解决办法
- oracle sql 写9乘9
- 2014年年终总结——获得集团优秀员工称号的心得体会
- 匿名管道 父子进程间通信
- 2种方法解决mysql主从不同步 .
- uil的简单常用操作
- MySQL保存jpg图片 测试通过
- [Objective-C] 使用Category给类添加private方法
- C# 中的扩展方法
- gdb调试常用命令
- python编程之bomb catcher 小游戏
- Android GPS学习笔记—LMS初始化