我尝试了有关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;
}