使用匿名管道在进程间通信 (System.IO.Pipes使用)(转)
原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/04/system-io-pipes.html
管道的用途是在同一台机器上的进程之间通信,也可以在同一网络不同机器间通信。在.Net中可以使用匿名管道和命名管道。管道相关的类在System.IO.Pipes命名空间中。.Net中管道的本质是对windows API中管道相关函数的封装。
使用匿名管道在父子进程之间通信:
匿名管道是一种半双工通信,所谓的半双工通信是指通信的两端只有一端可写另一端可读;匿名管道只能在同一台机器上使用,不能在不同机器上跨网络使用。
匿名管道顾名思义就是没有命名的管道,它常用于父子进程之间的通信,父进程在创建子进程是要将匿名管道的句柄作为字符串传递给子进程,看下例子:
父进程创建了一个AnonymousPipeServerStream,然后启动子进程,并将创建的AnonymousPipeServerStream的句柄作为参数传递给子进程。如下代码:
//父进程发送消息
Process process = new Process();
process.StartInfo.FileName = @"M:\ABCSolution\Child\Child\bin\Debug\Child.exe";
//创建匿名管道实例
using (AnonymousPipeServerStream stream =
new AnonymousPipeServerStream(PipeDirection.Out, System.IO.HandleInheritability.Inheritable))
{
//将句柄传递给子进程
process.StartInfo.Arguments = stream.GetClientHandleAsString();
process.StartInfo.UseShellExecute = false;
process.Start(); //销毁子进程的客户端句柄
stream.DisposeLocalCopyOfClientHandle();
//向匿名管道中写入内容
using (StreamWriter sw = new StreamWriter(stream))
{
sw.AutoFlush = true;
sw.WriteLine(Console.ReadLine());
}
}
process.WaitForExit();
process.Close();
子进程声明了一个AnonymousPipeClientStream实例,并从此实例中读取内容,如下代码:
//子进程读取消息
//使用匿名管道接收内容
using (StreamReader sr = new StreamReader(new AnonymousPipeClientStream(PipeDirection.In, args[])))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine("Echo:{0}", line);
}
}
这个程序要在cmd命令行中执行,否则看不到执行效果,执行的结果是在父进程中输入一行文本,子进程输出Echo:文本。
使用匿名管道在进程间通信 (System.IO.Pipes使用)(转)的更多相关文章
- System.IO之内存映射文件共享内存
内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就 像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数.这种方法能够很好的应用在需要频繁处理一个 ...
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
- Linux进程间通信——使用匿名管道
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一 ...
- Linux学习笔记(12)-进程间通信|匿名管道
Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等-- 现在一个个的开始学习! ----------------------------------------- ...
- Linux进程间通信-匿名管道
前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...
- Linux - 进程间通信 - 匿名管道
一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内 ...
- 进程间通信(IPC)-管道、匿名管道
每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读 ...
- IPC——匿名管道
Linux进程间通信——使用匿名管道 在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它 ...
- linux的IPC进程通信方式-匿名管道(一)
linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...
随机推荐
- [转] linux 下 进程和线程的区别
1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...
- apache2.2 虚拟主机配置详解
一.修改httpd.conf 打开appserv的安装目录,找到httpd.conf文件,分别去掉下面两行文字前面的#号. #LoadModule vhost_alias_module modules ...
- php知识点总结(待续)
function_exist()如果没有函数,返回空. is_string($str) 如果$str是布尔型的值,返回为空.是返回1,错误返回空is_array() 同上 字符串输出时,加逗号就自动空 ...
- php 基于phpexcel制作的导出excel类
最近要写个项目,由于项目中导出excel太多,因此写个类便于使用. <?php /**如果是gbk的编码,请转为UTF8 *@使用方法. *引入类库. * $excel = news excel ...
- C#中的委托和事件2-2(转)
引言 如果你看过了 C#中的委托和事件2-1 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些 ...
- Spring碎点知识
1.依赖注入:不仅可以为Bean注入普通的属性值,还可以注入其他Bean的作用.通过配置文件组织在一起,这里的Bean是Java对象 说明:关于依赖注入与控制反转的这两个名字,表达的都是同一个意思,只 ...
- 关于 "Context" 模式(基于COM思想IUnknown思想)
有同事很喜欢用Context模式,觉得是自己"首创", 我有些自己的想法, 或者大家可以发表下自己的观点. 什么是Context模式? 23种设计模式中没有这个模式, 是同事自 ...
- Oracle12c中新建用户
运行SQLPlus,以 sysdba打开 新建用户需要 create user C##[username] identified by [password] grant dba to C##[use ...
- Android全屏显示
requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_ ...
- 高性能Web服务器Nginx及相关新技术的应用实践-张宴
http://files.cnblogs.com/files/niaowo/%E9%AB%98%E6%80%A7%E8%83%BDWeb%E6%9C%8D%E5%8A%A1%E5%99%A8Nginx ...