以下更改将nethack nacl端口从使用nacl-mounts更新为nacl_io。在nacl-mounts版本中,使用JSPipeMount将来自浏览器的消息集中到nacl程序的stdin中。在nacl_io版本中,该如何完成?
https://chromium.googlesource.com/external/naclports/+/8ac229a6e3fddff3e061017a8eb85105874570b3%5E!/
如提交描述中所述:“浏览器和nexe之间的通信由TtyNode使用Pepper Simple处理。”
我在这里回答了有关native-client-discuss Google组的更多详细信息,回答了相同的问题:https : //groups.google.com/d/msg/native-client-discuss/nOKHWBhBPfs/i_gUYIFuBJAJ
这是该帖子的内容:
在nacl_io中,这只是一个节点(MountNodeTty
),而不是新的安装。您可以通过打开文件“ / dev / tty”来访问它。
最简单的方法是使用“ ppapi_simple”库。它执行以下操作:
pp::Instance::HandleMessage
为将数据转发到节点,然后可以通过从“ / dev / tty”读取来读取数据pp::Instance::PostMessage
。如果要将stdin和stdout映射到/ dev / tty,可以将PS_STDIN
andPS_STDOUT
参数设置为“ / dev / tty”。您可以通过向embed标签添加其他属性来做到这一点:
<embed src =“ ...” type =“ application / x-pnacl” PS_STDIN =“ / dev / tty” PS_STDOUT = / dev / tty“ ...>
要自己进行操作,您必须执行ppapi_simple库的操作。基本上,要将数据馈入节点,请使用对ioctl的调用:
这是Pepper_30中的代码(src / ppapi_simple / 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_simple / 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或从该库复制行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句