原文地址: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:文本。

最新文章

  1. 对C++虚函数的理解
  2. Cocostudio 文章列表
  3. 天书笔记:HTML+CSS实现顶部导航栏
  4. flask 项目的开发经验总结
  5. 重新初始化RAC的OCR盘和Votedisk盘,修复RAC系统
  6. Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识
  7. 三角函数计算,Cordic 算法入门
  8. C# IL DASM 使用
  9. 项目中的那些事---PHP函数
  10. hdu 1081 矩阵最大连续子序列
  11. Sql 行转列、列转行及分页
  12. VC++函数(win32_exe)
  13. mysql error 2005 - Unknown MySQL server host 'localhost'(11001)
  14. vue父子组件及非父子组件通信
  15. CentOS与Win7远程桌面互通
  16. oracle中向timeStamp类型字段插入当前时间
  17. Linux开机执行指定shell
  18. freemark简单事例
  19. JS实现网页背景旋转缩放轮播效果
  20. Java系列:使用软引用构建敏感数据的缓存

热门文章

  1. gui界面2048小游戏
  2. Qt5遇到的问题
  3. A Bug's Life(hdu1829种类并查集)
  4. switch语句中的选择因子
  5. 2.2 文件 I/O 的基石:Path
  6. 使用Jstl异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot&nbs
  7. yield 生成器例子
  8. 对比iOS网络组件:AFNetworking VS ASIHTTPRequest
  9. 卓越网的kindle paperwhite
  10. 监视系统3389的VBS脚本