且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

匿名管道实现父子进程之间的通信....

更新时间:2022-08-13 08:31:23

 /*匿名管道: 匿名管道可以实现父子进程的通信, 一个由另一个进程调用CreateProcess函数创建的进程称为子进程
我们在利用CreatePipe创建你民管道的时候会获得管道的读写句柄  子进程可以继承这个句柄 
在父进程通过  CreatePipe函数获得句柄可以对匿名管道进行读写操作
在子进程  通过GetStdHandle()通过不同的参数 可以获得标准 输入 输出 错误的 句柄 这些句柄对子进程来说都是从父进程继承过来的所以我们在
子进程也可以对匿名进行读写  这就实现了父子进程之间的通信
*/
#include<iostream>
#include "windows.h"
using namespace std ;
void main()
{
    HANDLE  hRead,hWrite ;
 SECURITY_ATTRIBUTES sa={0};
 sa.bInheritHandle=TRUE ;
 sa.lpSecurityDescriptor=NULL ;
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    ::CreatePipe(&hRead,  //返回管读取句柄
  &hWrite,  //返回管道写句柄
        &sa,//SECURITY_ATTRIBUTES结构体指针 一定不能为NULL否则子进程不能继承返回的句柄
     0//管道的buffer大小 0表示默认大小
     ) ; 
 
 PROCESS_INFORMATION  pp={0};//接收进程信息
 STARTUPINFO si ={0};  //表示子进程如何显示
 si.cb=sizeof(STARTUPINFO) ;//大小
 si.dwFlags=STARTF_USESHOWWINDOW ;//指定那些可用
 si.hStdInput=hRead ;//设置标准输入句柄 为管道读取句柄
 si.hStdOutput=hWrite ;//设置标准输出句柄为管道写句柄
 si.hStdError=::GetStdHandle(STD_ERROR_HANDLE) ;//调用函数获得标准错误句柄
 CreateProcess("sub.exe",//可执行模块的完整路径
  NULL ,//命令行参数
  NULL,//默认安全结构属性 NULL
  NULL,//同上
  TRUE,//子进程是否从Calling他的进程继承句柄
  0,//表示启动进程时的附加标记 这里我们只是创建一个进程设置为 0即可
  NULL,//表示新进程使用的内存块 NULL表示子进程使用父进程的内存块 
  NULL,//表示启动时子进程的路径名 如果为NULL表示子进程和父进程使用相同的路径名
  &si ,//表示子进程如何显示  还有为标准输入输出 标准错误句柄赋值为管道句柄
  &pp) ;//LPPROCESS_INFORMATION 结构体用来接收创建的子进程的信息
}

 

/////子进程

#include <iostream>
#include "windows.h"
using namespace std ;
void main()
{
 
 HANDLE  hRead=::GetStdHandle(STD_INPUT_HANDLE) ;
 char buf[100] ="";
 DWORD len ; 
 ::ReadFile(hRead,buf,100,&len,NULL) ;
 cout<<"读取到:"<<buf<<endl ;

}