如何使用 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 语言翻译。
我有以下 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 语言翻译。