我正在开发一个跨平台项目。在Windows上,我有一个运行进程/脚本(使用命令行)的类,等待它结束,并从它的stdout/stderr读取所有内容到缓冲区。然后我将输出打印到一个自定义的“控制台”上。注意:这不是将子stdout重定向到父标准输出,而是从子标准输出到父项的管道。将子stdout捕获到缓冲区
我是OSX/unix-like api的新手,但我可以理解做这样的事情的规范方式是分叉和管道stdouts在一起。不过,我不希望它重定向到stdout,我想捕获输出..它应该工作非常像这样(伪代码,相似与UNIX功能纯属巧合):
class program
{
string name, cmdline;
string output;
program(char * name, char * cmdline)
: name(name), cmdline(cmdline) {};
int run()
{
// run program - spawn it as a new process
int pid = exec(name, cmdline);
// wait for it to finish
wait(pid);
char buf[size];
int n;
// read output of program's stdout
// keep appending data until there's nothing left to read
while (read(pid, buf, size, &n))
output.append(buf, n);
// return exit code of process
return getexitcode(pid);
}
const string & getOutput() { return output; }
};
如何,我会去在OSX上这样做?
E:
好了,所以我研究了相关的API,似乎某种叉/ EXEC组合是不可避免的。现在的问题是,我的过程是非常大的并分叉它真的看起来是一个坏主意(我看到,如果父进程占用系统RAM的50%以上,一些unix实现不能这样做)。
我不能以任何方式避免此计划吗?我发现vfork()可能是一个可能的竞争者,所以也许我可以尝试使用vfork来模仿popen()函数。但是,大多数手册页声明,vfork可能只是fork()
也许它应该注意到它只是伪代码。 exec应该执行命令行。 – Shaggi