以下更改將使用nacl-mounts將nethack nacl端口更新爲nacl_io。在nacl-mounts版本中,JSPipeMount用於將來自瀏覽器的消息導入到nacl程序的stdin中。在nacl_io版本中,這是如何完成的?如何在NACL中重定向stdin和stdout?
https://chromium.googlesource.com/external/naclports/+/8ac229a6e3fddff3e061017a8eb85105874570b3%5E!/
以下更改將使用nacl-mounts將nethack nacl端口更新爲nacl_io。在nacl-mounts版本中,JSPipeMount用於將來自瀏覽器的消息導入到nacl程序的stdin中。在nacl_io版本中,這是如何完成的?如何在NACL中重定向stdin和stdout?
https://chromium.googlesource.com/external/naclports/+/8ac229a6e3fddff3e061017a8eb85105874570b3%5E!/
如在提交描述中描述: 「瀏覽器和nexe之間的通信是通過使用簡單的辣椒一個TtyNode處理。」
我回答同樣的問題與本機客戶端,討論谷歌組在這裏更詳細: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
和PS_STDOUT
參數設置爲「/ dev/tty」。您可以通過向嵌入標籤添加其他屬性來實現此目的:
< 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(:210的src/ppapi_simple/ps_instance.cc):設置
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));
最後,如果你想重定向標準輸入/輸出到/ 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,或行爲從該庫複製。