c# - 为什么我不能在 C# 中使用 Process 获取 C++ 程序的输出?

标签 c# c++ process redirectstandardoutput

我有一个 C++ 程序,它使用 wprintf_s 函数将结果打印到命令行中。但是当我在 C# 中使用 Process 读取程序的输出时,我无法得到它的任何字样。但是,当我在 wprintf_s 语句之后添加 fflush(stdout) 时,我终于可以在我的 C# 程序中读取标准输出了。

我用来启动进度的代码是:

var proc = new Process {
    StartInfo = new ProcessStartInfo {
        FileName = "FILENAME",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};
proc.Start();
StringCollection values = new StringCollection();

proc.OutputDataReceived += (s, args) => {
    lock (values) {
        values.Add(args.Data);
    }
};
proc.BeginOutputReadLine();
proc.WaitForExit();

谁能告诉我为什么 fflush(stdout) 会起作用?

最佳答案

输出在 C++ 进程中被缓冲,并将一直保持到缓冲区已满或被刷新,例如通过调用 fflush()、通过关闭流或其他依赖操作系统的原因。

fflush() 只是将输出缓冲区中的任何数据写入流。

如果您不想显式调用fflush(),您可以考虑通过调用setbuf() 在输出流上设置无缓冲模式。第二个参数为 NULL 指针:

#include <stdio.h>
#include <unistd.h>

int main()
{
    setbuf(stdout, (char *)NULL);

    while (1)
    {
        fputs("hi there\n", stdout);
        sleep(1);
    }
}

现在输出会立即出现。

请注意,如果 stdout 是一个终端,则 setbuf(f, NULL) 是不必要的,因为这是终端设备的默认行为。如果 stdout 是管道,则 setbuf(f, NULL) 将使其无缓冲。

关于c# - 为什么我不能在 C# 中使用 Process 获取 C++ 程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000655/

相关文章:

c# - 我可以在后台线程中使用 Screen 类吗?

C、fork()中的一些语句没有执行

bash - 使用 groovy,如何通过管道传输多个 shell 命令?

c# - 以编程方式获取 nuget 包的路径

c# - DB First 生成的上下文没有连接字符串的构造函数重载

c# - 获取 Func<T> 变量的参数

c++ - 在 Eclipse Mars 中链接 GLFW

C++错误未声明的标识符

c++ - 从类模板生成 lambda

java - 录制视频时启用相机闪光灯