为什么重定向标准输入会导致stdout无法打印到新的控制台进程?

时间:2015-05-27 21:16:21

标签: c# windows

所以我尝试使用Process.Start()运行单独的程序。

程序会偶尔暂停并等待输入。我希望能够通过标准输入向此过程发送信息。

我试图理解使用Windows OS shell创建新进程与重定向标准输入的效果之间的区别。

Exe                 UseShell    RedirectSTDIN  WINDOW Displays  OutputDisplays
cmd.exe /c program     Y               N             Y                Y
                       N               N             Y                Y
                       N               Y             Y                N

program.exe            Y               N             Y                Y
                       N               N             Y                Y
                       N               Y             Y                N

重要的信息就是如果我重定向标准输入,那么屏幕上就不会显示任何数据。

为什么会这样?

通常program.exe应该写入其stdout文件描述符。

我假设Process.Start()创建了一个控制台进程。根据 MSDN

  

创建一个新的控制台会产生一个新的控制台窗口,以及单独的I / O屏幕缓冲区。

我假设这个新窗口包含控制台并在控制台缓冲区中显示数据。因此,如果程序输出到stdout,我们应该在屏幕上看到该数据。

这是正常情况。为什么重定向标准输入会导致屏幕上没有显示任何内容,即使我没有触摸重定向标准输出?

编辑:

       startInfo.WindowStyle = ProcessWindowStyle.Normal;
        //startInfo.FileName = Path.Combine(BinaryDirectory, "program.exe");
        startInfo.FileName = "cmd.exe";
        startInfo.CreateNoWindow = false;

        //startInfo.Arguments = "";
        startInfo.Arguments = "/C program.exe" + startInfo.Arguments;
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardInput = true;
        startInfo.RedirectStandardOutput = true;

根据此处的文件: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681953(v=vs.85).aspx

进程可以使用AttachConsole函数附加到控制台。进程可以附加到一个控制台。控制台可以附加许多进程。

我认为我的进程可以挂钩到模拟器使用的控制台上然后我可以写入控制台。但是,它返回错误代码6:控制台句柄无效。

1 个答案:

答案 0 :(得分:0)

所以我使用Harry Johnson的方法让它工作:

cmd.exe /c program.exe >CON 2>&1

我也相信我可以轻松创建自己的窗口,隐藏进程的窗口并将输出直接输出到新窗口。

我只是想能够写入进程所在的窗口。但我还没有找到任何方法来做到这一点。我可以附加到该过程的控制台。但要写入该过程,我需要控制台的屏幕缓冲区