【发布时间】:2014-02-13 01:12:23
【问题描述】:
我目前正在开发一个跨平台项目。在 Windows 上,我有一个运行进程/脚本(使用命令行)的类,等待它结束,然后从它的 stdout/stderr 读取所有内容到缓冲区。然后我将输出打印到自定义“控制台”。注意:这不是子标准输出到父标准输出的重定向,只是从子标准输出到父标准的管道。
我是 OSX/unix 类 api 的新手,但我可以理解做这种事情的规范方法是将标准输出分叉和管道在一起。但是,我不想将它重定向到标准输出,我想捕获输出。它应该像这样工作(伪代码,与 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,似乎某种 fork/exec 组合是不可避免的。手头的问题是我的进程非常大并且分叉它看起来真的是个坏主意(我看到如果父进程占用系统的 50% 以上,一些 unix 实现就无法做到这一点内存)。
我不能以任何方式避免这种方案吗?我看到 vfork() 可能是一个可能的竞争者,所以也许我可以尝试使用 vfork 来模仿 popen() 函数。但是话又说回来,大多数手册页都指出 vfork 很可能只是 fork()
【问题讨论】:
-
也许它应该注意到它只是伪代码。 exec 应该执行命令行。
标签: c++ unix fork stdout child-process