2013-10-12 3 views
1

Нижеприведенное изменение обновляет nacl-порт nacl от использования nacl-mounts до nacl_io. В версии nacl-mounts JSPipeMount используется для вовлечения сообщений из браузера в stdin программы nacl . В версии nacl_io, как это делается?Как перенаправить stdin и stdout в NACL?

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

ответ

4

Как описано в описании фиксации: «Связь между браузером и Нешем обрабатывается 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 или копировать поведение из этой библиотеки.

Смежные вопросы