使用匿名管道在进程间通信 (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[0])))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        Console.WriteLine("Echo:{0}", line);
    }
}
复制代码

这个程序要在cmd命令行中执行,否则看不到执行效果,执行的结果是在父进程中输入一行文本,子进程输出Echo:文本。

posted @   天马3798  阅读(1384)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2013-12-23 IDisposable 接口2
2013-12-23 IDisposable接口详解
点击右上角即可分享
微信分享提示