匿名管道 父子进程间通信

来源:互联网 发布: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
原创粉丝点击