带有vala异步exec /管道示例的奇怪的stdout / stderr不定循环

时间:2018-09-01 12:31:08

标签: macos pipe vala gio

我尝试了有关exec和生成的示例,当使用vala运行它或使用valac进行编译时,下面的输出无休止地循环。那是正常的吗?顺便说一句,这是在OS X上,通常我在Linux上,以后可以在Linux上进行测试。 在brew上安装了Vala 0.40.9版,在brew上也安装了glib 2.58.0版。

out: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stderr: (null)stdout: (null)stde

编辑:在Ubuntu Xenial上运行相同的示例时,它可以按预期工作,但是默认情况下它也使用vala 0.30.1。那只是一个太旧的版本吗?但是至少现在我看到了示例的样子。

Edit2:使用的代码是https://valadoc.org/glib-2.0/GLib.Process.spawn_async_with_pipes.html中的“通过管道生成,异步”,无需进行任何修改,只需复制粘贴即可。

private static bool process_line (IOChannel channel, IOCondition condition, string stream_name) {
    if (condition == IOCondition.HUP) {
        print ("%s: The fd has been closed.\n", stream_name);
        return false;
    }

    try {
        string line;
        channel.read_line (out line, null, null);
        print ("%s: %s", stream_name, line);
    } catch (IOChannelError e) {
        print ("%s: IOChannelError: %s\n", stream_name, e.message);
        return false;
    } catch (ConvertError e) {
        print ("%s: ConvertError: %s\n", stream_name, e.message);
        return false;
    }

    return true;
}

public static int main (string[] args) {
    MainLoop loop = new MainLoop ();
    try {
        string[] spawn_args = {"ls", "-l", "-h"};
        string[] spawn_env = Environ.get ();
        Pid child_pid;

        int standard_input;
        int standard_output;
        int standard_error;

        Process.spawn_async_with_pipes ("/",
            spawn_args,
            spawn_env,
            SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,
            null,
            out child_pid,
            out standard_input,
            out standard_output,
            out standard_error);

        // stdout:
        IOChannel output = new IOChannel.unix_new (standard_output);
        output.add_watch (IOCondition.IN | IOCondition.HUP, (channel, condition) => {
            return process_line (channel, condition, "stdout");
        });

        // stderr:
        IOChannel error = new IOChannel.unix_new (standard_error);
        error.add_watch (IOCondition.IN | IOCondition.HUP, (channel, condition) => {
            return process_line (channel, condition, "stderr");
        });

        ChildWatch.add (child_pid, (pid, status) => {
            // Triggered when the child indicated by child_pid exits
            Process.close_pid (pid);
            loop.quit ();
        });

        loop.run ();
    } catch (SpawnError e) {
        print ("Error: %s\n", e.message);
    }
    return 0;
}

错误报告在这里:https://gitlab.gnome.org/GNOME/glib/issues/1512

0 个答案:

没有答案