2013-10-12 35 views

回答

4

如在提交描述中描述: 「瀏覽器和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的」
  • 寫入「的/ dev/tty的」讀書讀都變成通話到pp::Instance::PostMessage
  • 如果要將stdin和stdout映射到/ dev/tty,可以將PS_STDINPS_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,或行爲從該庫複製。

相關問題