1

以下の変更により、nacl-mounts を使用する nethack nacl ポートが nacl_io に更新されます。nacl-mounts バージョンでは、JSPipeMount を使用して、ブラウザから nacl プログラムの stdin にメッセージを送り込みます。nacl_io バージョンでは、それはどのように達成されますか?

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

4

1 に答える 1

4

コミットの説明で説明されているように、「ブラウザーと nexe の間の通信は、Pepper Simple を使用して TtyNode によって処理されます。」

こちらのネイティブ クライアント ディスカッション Google グループで同じ質問に回答しました

その投稿の内容は次のとおりです。

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" に設定できます。これを行うには、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 ノードのコールバック関数を明示的に設定する必要があります。3 番目の 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 を使用するか、そのライブラリから動作をコピーすることです。

于 2013-10-14T16:01:22.683 に答える