外部应用程序的重定向输出开始巧舌如簧(Redirecting output of an extern

2019-09-29 12:10发布

我试图用VALA开始使用GLib的与spawn_command_line_sync()的外部应用程序。 根据文档( http://valadoc.org/#!api=glib-2.0/GLib.Process.spawn_sync ),您可以将字符串传递到存储外部应用程序的输出。

虽然这起一个脚本,打印几行时能正常工作,我需要调用一个程序,将打印二进制文件的内容。 (例如, “猫的/ usr / bin中/ apt-get的”)

有没有什么办法,我怎么能接收外部程序的输出不是在一个字符串,但在数据流或类似的东西?

我打算到外部程序的输出中写入文件,所以只是叫“猫的/ usr / bin中/ apt-get的> OUTPUTFILE”将是一个选择(不是很好),但它似乎不工作。

无论如何,我宁愿它来获得某种输出流。 我将不胜感激任何帮助。

使用代码IM:

using GLib;

static void main(string[] args) {
    string execute = "cat /usr/bin/apt-get";
    string output = "out";

    try {
        GLib.Process.spawn_command_line_sync(execute, out output);
    } catch (SpawnError e) {
        stderr.printf("spawn error!");
        stderr.printf(e.message);
    }

    stdout.printf("Output: %s\n", output);
}

Answer 1:

GLib.Process.spawn_async_with_pipes可以让你做到这一点。 它产生的过程,并返回每个的文件描述符stdoutstderrstdin 。 还有的代码在ValaDoc如何建立一个样品IOChannel s到监控输出。



Answer 2:

谢谢你,我必须overread spawn_async_with_pipes()返回整数,而不是字符串。

这有什么不妥做这种方式? (除了1的缓冲器大小)

using GLib;

static void main(string[] args) {

    string[] argv = {"cat", "/usr/bin/apt-get"};
    string[] envv = Environ.get();
    int child_pid;
    int child_stdin_fd;
    int child_stdout_fd;
    int child_stderr_fd;

    try {
        Process.spawn_async_with_pipes(
            ".",
            argv,
            envv,
            SpawnFlags.SEARCH_PATH,
            null,
            out child_pid,
            out child_stdin_fd,
            out child_stdout_fd,
            out child_stderr_fd);

    } catch (SpawnError e) {
        stderr.printf("spawn error!");
        stderr.printf(e.message);
        return;
    }

    FileStream filestream1 = FileStream.fdopen(child_stdout_fd, "r");
    FileStream filestream2 = FileStream.open("./stdout", "w");

    uint8 buf[1];
    size_t t;
    while ((t = filestream1.read(buf, 1)) != 0) {
        filestream2.write(buf, 1);
    }
}


文章来源: Redirecting output of an external application started with glib
标签: glib output vala