Как описано в описании фиксации: «Связь между браузером и Нешем обрабатывается TtyNode с использованием Pepper Simple».
я ответил тот же вопрос более подробно на родном-клиента обсудить группы 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»
- пишет в «/ Dev/TTY» превращаются в вызовы до
pp::Instance::PostMessage
.
Если вы хотите сопоставить stdin и stdout с/dev/tty, вы можете установить аргументы PS_STDIN
и PS_STDOUT
в «/ dev/tty». Вы можете сделать это, добавив дополнительные атрибуты в свой тег embed:
< embed src = "..." type = "application/x-pnacl" PS_STDIN = "/ dev/tty" PS_STDOUT =/dev/tty " . ... >
чтобы сделать это самостоятельно, вам придется делать то, что библиотека ppapi_simple делает в основном, чтобы передавать данные в узел, можно использовать вызов IOCTL:
Здесь код из pepper_30 (ЦСИ/ppapi_simple/ps_instance.cc: 328). код из pepper_32 похож
012.
Чтобы иметь вызов узла pp::Instance::PostMessage
при записи в него, вы используете другой вызов IOCTL:
В pepper_30, это делается автоматически. Все сообщения имеют префикс, поэтому вы можете их отличить. Это может быть установлен с IOCTL (ЦСИ/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 (ЦСИ/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/стандартный вывод в/Dev/TTY, вы должны сделать это вручную.Это как ppapi_simple делает это (ЦСИ/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 или копировать поведение из этой библиотеки.