コミットの説明で説明されているように、「ブラウザーと nexe の間の通信は、Pepper Simple を使用して TtyNode によって処理されます。」
こちらのネイティブ クライアント ディスカッション Google グループで同じ質問に回答しました。
その投稿の内容は次のとおりです。
nacl_io では、これは単なるノード ( MountNodeTty
) であり、新しいマウントではありません。ファイル「/dev/tty」を開くことでアクセスできます。
これを使用する最も簡単な方法は、「ppapi_simple」ライブラリを使用することです。次のことを行います。
自分で行うには、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 を使用するか、そのライブラリから動作をコピーすることです。