标题:
进程间通信 - 匿名管道实现
[打印本页]
作者:
yuyang911220
时间:
2017-1-25 19:37
标题:
进程间通信 - 匿名管道实现
引子
前面的两篇博文分别介绍了通过剪贴板和通过邮槽来实现进程之间的通信,
其中剪贴板呢,是用来实现本地两个进程之间的通信,
而邮槽则既可以实现本地两个进程之间的通信,也可以实现本地进程和服务器进程的通信,
当然,上面这两种方式都是有局限性的,比如剪贴板就只能实现本地进程之间的通信,
而在邮槽中,虽然是既可以实现本地进程之间的通信,又能实现本地进程和远程服务器进程的通信,
但是使用邮槽的话,服务端只能接收数据,不能发送数据,而客户端只能发送数据而不能接收数据。
而本篇博文介绍的这个通过匿名管道来实现进程之间的通信的话,
局限性就显得更加严重了,
第一:匿名管道只能实现本地进程之间的通信,不能实现跨网络之间的进程间的通信。
第二:匿名管道只能实现父进程和子进程之间的通信,而不能实现任意两个本地进程之间的通信。
匿名管道概述
既然是匿名管道的话,自然,就是没有名字的管道了,还有一种管道呢,叫做命名管道,
命名管道的功能是很强大的,匿名管道在命名管道面前,功能那是简陋的不行的,
至于命名管道的话,会留到下一篇博文中介绍的,
匿名管道正因为提供的功能很单一,所以它所需要的系统的开销也就比命名管道小很多,
在本地机器上可以使用匿名管道来实现父进程和子进程之间的通信,
这里需要注意两点,第一就是在本地机器上,这是因为匿名管道不支持跨网络之间的两个进程之间的通信,
第二就是实现的是父进程和子进程之间的通信,而不是任意的两个进程。
然后得话还顺便介绍匿名管道的另外一种功能,其通过匿名管道可以实现子进程输出的重定向,
何为输出重定向呢?还请听下面详解:
比如我现在建立一个 Win32 的 Console 程序,然后在其中使用如下代码来输出一些信息:
#include <iostream>using namespace std; int main(int argc, char * argv){ cout<<"Zachary XiaoZhen "<<endl<<endl; cout<<"Happy New Year"<<endl<<endl; system("pause");}
那么在默认下,编译运行上面的代码时,Windows 会弹出一个黑框框,并且在这个黑框框中显示一些信息,
为什么一定要将输出的信息显示在这个黑框框中呢?有没有办法让其显示在我们自己定义的文本框中呢?
而后我们再看一幅截图:
上面画了很多红线的这个区域中的信息来自那里呢?为什么会在这个文本框中输出呢?
其实这就可以通过匿名管道来实现,
在卸载 QQ 游戏这幅截图中呢,其实运行了两个进程,
一个就是我们看到的这个输出了图形界面的进程,我们称之为卸载表象进程(父进程),
而另外一个用来执行真正意义上的卸载的进程我们称之为卸载实质进程(子进程)。
其实该卸载表象进程在其执行过程中创建了卸载实质进程来执行真正的卸载操作,
而后,卸载实质进程会输出上面用红色矩形标记的区域中的信息,
如果我们使用默认的输出的话,卸载实质进程会将上面红色区域标记中的信息输出到默认的黑框框中,
但是我们可以使用匿名管道来更改卸载实质进程的输出,
让其将输出数据输入到匿名管道中,而后卸载表象进程从匿名管道中读取到这些输出数据,
然后再将这些数据显示到卸载表象进程的文本框中就可以了。
而上面的这种用来更改卸载实质进程的输出的技术就称之为输出重定向。
当然与之相对的还有输入重定向的。
我们可以让一个进程的输入来自于匿名管道,而不是我们在黑框框中输入数据。
话说到这份上呢,也可以点出一点东东了,
上面的这个重定向不就是利用匿名管道实现的父进程和子进程之间的通信嘛。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0