如何使用 C 中的 GSubprocess 检索实时输出?

How to retrieve real time output with GSubprocess in C?

我有以下 C 代码:

#include <gio/gio.h>

int main(void) {

    GSubprocess *process;
    gchar *output;
    gchar *error;

    process = g_subprocess_new(G_SUBPROCESS_FLAGS_STDOUT_PIPE, NULL, "./for.sh", NULL);

    g_subprocess_communicate_utf8(process, NULL, NULL, &output, &error, NULL);

    g_print("%s", output);
}

和以下 bash 代码:

#!/bin/bash

for i in {1..3}
do
    echo "$i"
    sleep 1
done

我遇到的问题是 C 代码将等到 bash 代码(或与此相关的任何其他代码)完成打印其输出。我更喜欢逐行实时打印它。

我在 Python 中找到了解决方案,但我不知道如何将其转换为 C。任何指针都将受到赞赏。

代码中的答案是这样的:

#include <gio/gio.h>

int main(void) {

    GSubprocess *process;
    GInputStream *stream;
    char buffer[4];

    process = g_subprocess_new(G_SUBPROCESS_FLAGS_STDOUT_PIPE, NULL, "./for.sh", NULL);

    stream = g_subprocess_get_stdout_pipe(process);

    while(g_input_stream_read(stream, buffer, sizeof(buffer), NULL, NULL))
        g_print("%s", buffer);

    return 0;
}

有趣的是,根据 buffer[] 的值,输出是正确的还是伴随着垃圾。如果我将 buffer[4] 更改为 buffer[8],我会得到垃圾。如果我使用 buffer[12] 那么它是正确的。奇怪。

您需要在循环中使用 g_subprocess_get_stdout_pipe(), and then read from it using g_input_stream_read()(或其他一些输入流读取函数)从 GSubprocess 获取标准输出管道,直到子进程退出。

您可能想对 stderr 做同样的事情,但为了做到这一点,您需要使用 GMainLoop 轮询两者,因为您不能阻止读取两个立即流。

看到您的 Python 代码可能会让人们帮助您进行 C 语言翻译。