为什么我无法使用 C# 中的 Process 获取C++程序的输出?

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

本文关键字:C++ 获取 程序 输出 Process 中的 为什么      更新时间:2023-10-16

我有一个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() ,可以考虑通过在第二个参数使用 NULL 指针调用setbuf()来在输出流上设置无缓冲模式:

#include <stdio.h>
#include <unistd.h>
int main()
{
    setbuf(stdout, (char *)NULL);
    while (1)
    {
        fputs("hi theren", stdout);
        sleep(1);
    }
}

现在输出将立即出现。

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