进程间通信(基于Windows编程)学…

1.匿名管道

匿名管道式一个没有命名的单向管道。通常用来在子进程和父进程之间通信。不能够实现跨网络通信。只能在父进程中调用CreateProcess函数来穿件子进程,将管道的读、写句柄传递给子程序。

创建匿名管道:

Bool CreatePipe();  此函数的第三个参数必须够着一个SECURITY_ATTRIBUTES的结构体变量。

当一个子进程从其父进程继承了匿名管道的句柄后,这2个进程就可以通过该句柄进行通信了。

  • 进程的创建

bool CreateProcess(...);

 

具体实现:

1、首先在view类中定义2个成员变量:hRead和hWrite,并在析构函数中释放

2、创建匿名管道

  •   定义安全结构体(SECURITY_ATTRIBUTES),将bInheritHandle设置为TRUE。
  • 调用CreatePipe()函数。
  • 启动子程序,并且将读写句柄传递给子程序。启动进程采用CreateProcess()函数。此时需要定义一个STARTUPINFO结构体类型的值,用来指定新进程的主窗口如何显示。

注意:在使用STARTUPINFO机构变量时,只是用到了其中一部分值。因此首先要使用ZeroMemory()函数将其中的变量初始化为0(否者其中的变量为随机值)。

然后将子进程的标准输入和输出句柄分别设置为管道的读、写句柄。

 

 STARTUPINFO sui;

ZeroMemory(&sui,sizeof(STARTUPINFO));

sui.cb=sizeof(STARTUPINFO);

sui.dwFlags=STARTF_USESTDHANDLES;

sui.hStdInput=hRead;

sui.hStdOutput=hWrite;

sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);

 

当创建一个新的进程时候,系统会为该进程创建一个进程内核对象和一个县城内核对象,而内核对象都有个一使用计数器。当CreateProcess函数在内部打开这些对象时候,其使用计时器就加一。

 

  • 读取数据

使用ReadFile()函数从匿名管道的读句柄从管道中读取数据。

  • 写入数据

WriteFile()实现

  • 子进程的实现
  1. 获取管道的读取和写入句柄

   hRead=GetStdHandle(STD_INPUT_HANDLE);

   ......

   2.读取数据

   3.写入数据

 

 

你可能感兴趣的:(进程间通信(基于Windows编程)学…)