我试图用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);
}
GLib.Process.spawn_async_with_pipes可以让你做到这一点。 它产生的过程,并返回每个的文件描述符stdout
, stderr
和stdin
。 还有的代码在ValaDoc如何建立一个样品IOChannel
s到监控输出。
谢谢你,我必须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);
}
}