【问题标题】:C#: Redirect Standard Output of a Process that is Already RunningC#:重定向已经运行的进程的标准输出
【发布时间】:2011-01-06 22:32:00
【问题描述】:

我一直很难获得“子进程”的输出(一个由我通过 c# System.Diagnostics.Process 监控的黑盒进程在内部启动)

我接受了我之前帖子的答案给出的建议: here。在那里你可以找到我所经历的细节。

此时,虽然我能够找到由 process1.exe 生成的 ssh 进程,但我正在监视该进程。我无法将输出重定向到我的 c# 程序,因为它是一个“已经运行的进程”,并且不是直接从 C# 启动的。

您在 System.Diagnostics.Process 对象上设置的所有属性似乎只有在您从 c# 应用程序显式启动该进程时才会生效;如果某个其他“非托管进程”启动了该进程,则设置此重定向无效,因为该进程已由未指定我需要的重定向的东西启动。

有什么方法可以重定向已经启动的进程的输出(由程序启动的进程,在该进程启动之前我没有预先指定重定向的范围)?

【问题讨论】:

    标签: c# ssh cmd system.diagnostics


    【解决方案1】:

    除了直接从正在运行的进程重定向输出之外,您是否可以在输出离开进程 A 到预期目的地时捕获输出,然后将其传递到您的新进程中?

    【讨论】:

    • 这怎么可能?我已经将 process1.exe 的所有输出重定向到我的 C# 应用程序。在 process1 内部启动 ssh.exe (process2) 时,我从 process1 收到了另外 3 行输出,然后所有输出都停止了,因为 process2 是唯一输出的东西(我怀疑),我无法重定向 process2输出,因为它是由 process1 内部启动的(我无法控制重定向)。
    【解决方案2】:

    假设没有更直接的解决方案,您可以尝试通过 CreateRemoteThread() 在另一个进程中运行一段代码,解释为 here

    【讨论】:

      【解决方案3】:

      也许你可以看看这个code。我在寻找做同样事情的解决方案时发现了它;但是,它并不是真正的进程间。

      如果这对您没有帮助,您可以查看在重定向标准输出时应该使用的 P/Invoking SetStdHandleGetStdHandle。我认为这就是链接到的代码示例使重定向发生的原因。

      注意:我只是看了这些东西,并没有真正让它正常工作。 (我有一个更好的解决方案可供我使用,因为我可以访问输出到控制台的源代码)

      【讨论】:

      • 虽然没有经过全面测试(或真正工作 AFAIR):pastebin.com/m13ab7101 这是我基于SetStdHandle 东西开发的。 HTH!
      【解决方案4】:

      我也有同样的困惑。我不能在从属进程中调用任何内部。它已经在运行,哪些代码超出了我的控制范围。但我知道它会吐出标准输出,我想对其进行监控、处理等。这是我启动进程的一件事,我可以配置重定向,但在这种情况下,进程将在我启动主要从属进程之后启动。所以我没有那个选项。我还没有找到让 .NET Process 在这些条件下工作的方法。也许还有另一种方式,也许 C++ 是这里的方式?这是可以接受的,但如果可能的话,我想从 .NET C# 的角度来处理它。

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 2013-06-02
        • 2010-11-22
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多