我有一个用 C#(控制台)编写的类似 shell 的命令行实用程序,我正在尝试向其添加管道/重定向支持,因此命令如下:
MyShellPrompt> SomeCustomCommand | 一个.exe | b.exe | c.exe
可以创建 a、b 和 c.exe 并连接它们的标准输入/标准输出,例如 bash。具体来说,我的 shell 具有特定于 shell 的自定义命令(与自定义硬件交互),其输出被写入 a.exe 的标准输入,a.exe 的标准输出通过管道传输到 b.exe 的标准输入,b.exe 的标准输出通过管道传输到 c。 exe的标准输入。c.exe 的标准输出由我的 shell 程序继承,因此它只是写入控制台。
诸如this one之类的答案表明您可以重定向stdin和stdout,但是您没有创建子流程来引用同一管道的相对端,这使您(启动程序)可以“连接”两者的末端管道(从一个进程的输出到第二个进程的输入)通过研磨数据,从一个应用程序的标准输出复制到下一个应用程序的标准输入。在一般情况下,这可能会变得乏味,而且鉴于这可以在 C++ Win32 example和C/Linux中完成,这似乎不是必需的。但似乎 .NET System.Diagnostics.Process类不提供任何类型的管道分配,因为 StandardInput 和 StandardOutput 属性是只读的。
有没有办法在.NET中做到这一点?(或者,由于缺乏功能,我为我的 shell 实用程序选择的 C# 从一开始就注定(在这方面)(这不会是第一次......):-))。理想情况下,我会避免使用 P/Invoke,因为这会破坏平台独立性......
如果您的回答是“是的,您可以通过在管道之间复制数据来做到这一点”(如上所述),那么我将把它扔在那里(至少对我而言),一般情况下的实现已被证明是轻微的在处理 N 个 EXE 和无限量(或至少大量)流经链的数据时更加困难。似乎必须使用异步 I/O 在每个 N-1 管道连接之间跳转以保持它们全部运行(我实际上还没有尝试过......),或者将 N-1 线程专用于每个管道连接(似乎工作......)。:(