我正在開發一個跨平臺項目。在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