下面的更改将nethack端口从使用nacl -挂载更新到nacl_io。在nacl -挂载版本中,JSPipeMount用于将消息从浏览器导入到nacl程序的stdin中。在nacl_io版本中,这是如何实现的?
https://chromium.googlesource.com/external/naclports/+/8ac229a6e3fddff3e061017a8eb85105874570b3%5E!/
发布于 2013-10-14 16:01:22
正如提交说明中所述:“浏览器和nexe之间的通信由TtyNode使用Pepper处理。”
我回答了同样的问题,并提供了关于本地客户端讨论Google组的更多细节:gUYIFuBJAJ。
下面是那篇文章的内容:
在nacl_io中,这只是一个节点(MountNodeTty),而不是一个新的挂载。您可以通过打开文件"/dev/tty“来访问它。
使用这一点的最简单方法是使用"ppapi_simple“库。它做了以下工作:
pp::Instance::HandleMessage将数据转发到节点,然后从"/dev/tty“读取数据pp::Instance::PostMessage的调用。PS_STDIN和PS_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的代码类似。
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):
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):
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):
int fd0 = open(getenv("PS_STDIN"), O_RDONLY);
dup2(fd0, 0);
int fd1 = open(getenv("PS_STDOUT"), O_WRONLY);
dup2(fd1, 1);同样,实现这一点的最简单方法是使用ppapi_simple,或者从该库复制行为。
https://stackoverflow.com/questions/19329515
复制相似问题