我刚刚从 Node.js 中找到了这个实现:
https://github.com/joyent/node/blob/master/lib/console.js https://github.com/joyent/node/blob/master/lib/util.js
当然你需要采用这个代码。它使用 Nodejs 全局对象process及其stdout和stderr对象。以下是创建此类文件对象的一些示例 C++ 代码:
static void js_file_write(const v8::FunctionCallbackInfo<v8::Value>& info) {
int fd = (int) info.Data().As<External>()->Value();
auto isolate = Isolate::GetCurrent();
if( info.Length() != 1) {
isolate->ThrowException(
v8::Exception::TypeError(jsStr("js_file_write: expects exactly 1 arg")));
return;
}
if( !info[0]->IsString() ) {
isolate->ThrowException(
v8::Exception::TypeError(jsStr("js_file_write: expects a string")));
return;
}
std::string s = jsObjToString(info[0], false, "");
size_t c = 0;
while(c < s.size()) {
int ret = write(fd, &s[c], (unsigned int) (s.size() - c));
if(ret < 0) {
isolate->ThrowException(
v8::Exception::Error(jsStr("js_file_write: write(" + to_string(fd) + ") error " + to_string(errno) + ": " + strerror(errno))));
errno = 0;
return;
}
c += ret;
}
}
static Local<Object> makeFileObj(int fd) {
auto isolate = Isolate::GetCurrent();
Handle<External> selfRef = External::New(isolate, (void*) fd);
auto obj = Object::New(isolate);
obj->Set(jsStr("write"),
FunctionTemplate::New(isolate, js_file_write, selfRef)->GetFunction());
return obj;
}
static Local<Object> makeProcessObj() {
auto obj = Object::New(Isolate::GetCurrent());
obj->Set(jsStr("stdout"), makeFileObj(STDOUT_FILENO));
obj->Set(jsStr("stderr"), makeFileObj(STDERR_FILENO));
return obj;
}
Run Code Online (Sandbox Code Playgroud)
jsStr并且jsObjToString非常规范。