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

Why can't I get the output of a C++ program using Process in C#?

我有一个 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()、关闭流或其他 OS 相关原因。

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) 将使其无缓冲。