首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NACL中重定向stdin和stdout?

如何在NACL中重定向stdin和stdout?
EN

Stack Overflow用户
提问于 2013-10-12 01:33:09
回答 1查看 640关注 0票数 1

下面的更改将nethack端口从使用nacl -挂载更新到nacl_io。在nacl -挂载版本中,JSPipeMount用于将消息从浏览器导入到nacl程序的stdin中。在nacl_io版本中,这是如何实现的?

https://chromium.googlesource.com/external/naclports/+/8ac229a6e3fddff3e061017a8eb85105874570b3%5E!/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 16:01:22

正如提交说明中所述:“浏览器和nexe之间的通信由TtyNode使用Pepper处理。”

我回答了同样的问题,并提供了关于本地客户端讨论Google组的更多细节:gUYIFuBJAJ

下面是那篇文章的内容:

在nacl_io中,这只是一个节点(MountNodeTty),而不是一个新的挂载。您可以通过打开文件"/dev/tty“来访问它。

使用这一点的最简单方法是使用"ppapi_simple“库。它做了以下工作:

  • 设置pp::Instance::HandleMessage将数据转发到节点,然后从"/dev/tty“读取数据
  • 写入"/dev/tty“将转换为对pp::Instance::PostMessage的调用。
  • 如果要将stdin和stdout映射到/dev/tty,可以将PS_STDINPS_STDOUT参数设置为"/dev/tty“。您可以通过向嵌入标记添加其他属性来做到这一点: <嵌入src=“.”Type=“application/x”PS_STDIN="/dev/tty“PS_STDOUT=/dev/tty"...>

要做到这一点,您必须执行ppapi_simple库所做的工作。基本上,要将数据输入到节点,可以使用对ioctl的调用:

下面是来自pepper_30 (src/ppapi_simpl/ps_instance.cc:328)的代码。来自pepper_32的代码类似。

代码语言:javascript
复制
struct tioc_nacl_input_string ioctl_message;
ioctl_message.length = message_len;
ioctl_message.buffer = message_str.data();
int ret =
  ioctl(fd_tty_, TIOCNACLINPUT, reinterpret_cast<char*>(&ioctl_message));

要让节点在写入时调用pp::Instance::PostMessage,可以使用对ioctl的不同调用:

在pepper_30中,这是自动完成的。但是,所有的消息都是前缀,这样您就可以区分它们。这可以用ioctl设置(src/ppapi_simpl/ps_instance.cc:210):

代码语言:javascript
复制
const char* tty_prefix = getenv("PS_TTY_PREFIX");
if (tty_prefix) {
  fd_tty_ = open("/dev/tty", O_WRONLY);
  if (fd_tty_ >= 0) {
    ioctl(fd_tty_, TIOCNACLPREFIX, const_cast<char*>(tty_prefix));
  } else {
    Error("Failed to open /dev/tty.\n");
  }
}

在pepper_31和更高版本中,您必须显式地为tty节点设置一个回调函数。您可以使用第三个ioctl (src/ppapi_simple/ps_instance.cc:221):

代码语言:javascript
复制
  tioc_nacl_output handler;
  handler.handler = TtyOutputHandlerStatic;
  handler.user_data = this;
  ioctl(tty_fd_, TIOCNACLOUTPUT, reinterpret_cast<char*>(&handler));

最后,如果要将stdin/stdout重新映射到/dev/tty,则还必须手动完成。ppapi_simple就是这样做的(src/ppapi_simple/ps_instance:201):

代码语言:javascript
复制
int fd0 = open(getenv("PS_STDIN"), O_RDONLY);
dup2(fd0, 0);

int fd1 = open(getenv("PS_STDOUT"), O_WRONLY);
dup2(fd1, 1);

同样,实现这一点的最简单方法是使用ppapi_simple,或者从该库复制行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19329515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档