编写你的应用程序(六)、nacl_io库-程序员宅基地

技术标签: ViewUI  ui  c/c++  javascript  

原文链接:https://developer.chrome.com/native-client/devguide/coding/nacl_io

注意:已针对ChromeOS以外的平台公布了此处所述技术的弃用。
请访问我们的 迁移指南 了解详情。


nacl_io库

介绍

nacl_io是一个实用程序库,提供标准C API的实现,如POSIX I / O(stdio.h)和BSD套接字(sys/socket.h)。它的主要功能是允许在Native Client模块中编译和使用使用这些标准API的代码。该库作为Native Client SDK的一部分包含在内,并在Pepper API之上实现。

由于Native Client模块无法直接访问主机的文件系统,因此nacl_io提供了几种可供应用程序使用的备用文件系统类型。例如,Chrome浏览器支持HTML5文件系统API ,该API提供对本地文件系统的受保护区域的访问。可以使用JavaScript命令通过HTML页面访问此文件系统,也可以使用Pepper File IO API通过Native Client模块访问此文件系统。

与nacl_io一个本机客户端应用程序可以安装一个文件系统HTML5并经由标准POSIX I / O功能访问它如fopenfseek, freadfwrite,和fclose,或它们的低级别UNIX同行 openlseekreadwriteclose。除HTML5文件系统外,nacl_io还提供了其他几种文件系统类型,如下表所示:

文件系统 描述
MEMFS 内存中的文件系统
html5fs HTML5本地文件系统,可以是持久的也可以是临时的
HTTP 将远程Web服务器上的文件映射到本地文件系统。
dev 含特殊文件的文件系统(例如:/dev/null

使用nacl_io

使用nacl_io主要是使用标准POSIX C库函数。但是,初始化库和设置文件系统安装需要一些步骤。通常,在NaCl应用中使用nacl_io需要以下步骤:

  1. 将应用程序与nacl_io库链接(-lnacl_io
  2. 使用nacl_io_init_ppapi或 nacl_io_init函数在启动时初始化nacl_io 。
  3. 使用该mount功能挂载任何所需的文件系统。mount有关不同文件系统类型的参数详见include/nacl_io/nacl_io.h
  4. 如果要安装HTML5文件系统,请确保为其分配空间。您可以unlimitedStorage在应用程序的Web Store清单文件中设置权限,也可以调用HTML5 QuotaManagement API。文件IO文档中介绍了这些选项。
  5. 确保文件和套接字API调用都是从后台线程完成的。这是因为主要的Pepper线程不支持POSIX I / O操作所需的阻塞行为。

登录nacl_io

与nacl_io的大多数输入/输出不同,内部日志记录直接写入stderrNaCl过程的 流。它故意绕过nacl_io中实现的标准库函数,以避免对自身进行循环调用。

nacl_io演示

构建并运行演示

演示应用程序启动一个Native Client模块,该模块安装三个文件系统并显示一组控件,使您可以使用它们:

/native-client/images/nacl_io1.png

按照以下步骤构建并运行演示:

  • 在demo目录中打开一个终端:

    $ cd $NACL_SDK_ROOT/examples/demo/nacl_io_demo

     

  • 运行演示:

    $ make run

     

演示运行后,请尝试以下操作:

  1. 选择fopen命令(当您选择命令时,下面一行中的字段将根据命令更改)
  2. 输入文件名 /persistent/test
  3. 选中写入复选框,然后按fopen按钮
  4. 选择fwrite命令并/persistent/test在左侧下方显示的菜单中选择文件
  5. 输入一些数据,然后按下fwrite按钮
  6. 选择fclose命令,确保/persistent/test在菜单中选择了文件,然后按fclose按钮
  7. 选择fopen命令
  8. 输入文件名 /persistent/test
  9. 选中fread复选框,然后按fopen按钮
  10. 选择fread命令,确保在菜单中选择文件/ persistent / test,输入字节数,然后按下fread按钮

看一下代码

该演示用C语言编写,包含三个文件。

nacl_io_demo.c

这是演示的主文件。此处的代码创建并初始化Native Client模块实例。Pepper函数Instance_DidCreate初始化nacl_io并在其中安装HTML5文件系统/persistent

static PP_Bool Instance_DidCreate(PP_Instance instance,
                                  uint32_t argc,
                                  const char* argn[],
                                  const char* argv[]) {
  g_instance = instance;
  nacl_io_init_ppapi(instance, get_browser_interface);
  mount(
      "",  /* source */
      "/persistent",  /* target */
      "html5fs",  /* filesystemtype */
      0,  /* mountflags */
      "type=PERSISTENT,expected_size=1048576");  /* data specific to the html5fs type */

  pthread_create(&g_handle_message_thread, NULL, &HandleMessageThread, NULL);
  InitializeMessageQueue();

  return PP_TRUE;
}

/persistent初始化模块后,会为文件系统分配空间。这是通过domContentLoaded文件中的函数完成的example.js。该脚本包含在模块的html页面中(请参阅参考资料 examples/demo/index.html):

function domContentLoaded(name, tc, config, width, height) {
  navigator.webkitPersistentStorage.requestQuota(window.PERSISTENT, 1024 * 1024,
      function(bytes) {
        common.updateStatus(
            'Allocated ' + bytes + ' bytes of persistent storage.');
        common.createNaClModule(name, tc, config, width, height);
        common.attachDefaultListeners();
      },
      function(e) { alert('Failed to allocate space') });
}

Instance_DidCreate函数还创建一个工作线程,该线程接收从html页面发送的消息并执行指定的文件系统操作。工作线程的逻辑在其他两个文件中编码,如下所述。

queue.c

此文件实现了一个循环队列,用于从浏览器UI接收消息到Native Client模块。排队消息中的文件系统命令在工作线程上执行。这样可以阻止主要Native Client线程的调用(如fread),这是一件好事。队列在nacl_io_demo.c中初始化Instance_DidCreate

handlers.c

此文件实现与从浏览器发送的命令关联的stdio调用。Handle*每个命令都有一个单独的函数:fopen,fclose,fseek,fread,fwrite。处理程序从HandleMessagenacl_io_demo.c中的函数调用,该 函数在管理消息队列的工作线程中运行。fwrite处理程序的代码如下所示。请注意,它不包含任何PPAPI调用,看起来像“普通”C代码。

int HandleFwrite(int num_params, char** params, char** output) {
  FILE* file;
  const char* file_index_string;
  const char* data;
  size_t data_len;
  size_t bytes_written;

  if (num_params != 2) {
    *output = PrintfToNewString("Error: fwrite takes 2 parameters.");
    return 1;
  }

  file_index_string = params[0];
  file = GetFileFromIndexString(file_index_string, NULL);
  data = params[1];
  data_len = strlen(data);

  if (!file) {
    *output = PrintfToNewString("Error: Unknown file handle %s.",
                                file_index_string);
    return 2;
  }

  bytes_written = fwrite(data, 1, data_len, file);

  *output = PrintfToNewString("fwrite\1%s\1%d", file_index_string,
                              bytes_written);
  return 0;
}

参考信息

此处讨论的示例包含在目录中的SDK中 examples/demo/nacl_io_demo

nacl_io库包含在SDK工具链中,不属于Pepper API的一部分。有关nacl_io接口的参考信息,请参阅位于的SDK目录中的头文件 include/nacl_io/nacl_io.h

有关HTML5文件系统的更多信息,请阅读规范

CC-By 3.0许可下提供的内容

转载于:https://www.cnblogs.com/SunkingYang/p/11049128.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baixingzhi2917/article/details/102089798

智能推荐

React学习记录-程序员宅基地

文章浏览阅读936次,点赞22次,收藏26次。React核心基础

Linux查磁盘大小命令,linux系统查看磁盘空间的命令是什么-程序员宅基地

文章浏览阅读2k次。linux系统查看磁盘空间的命令是【df -hl】,该命令可以查看磁盘剩余空间大小。如果要查看每个根路径的分区大小,可以使用【df -h】命令。df命令以磁盘分区为单位查看文件系统。本文操作环境:red hat enterprise linux 6.1系统、thinkpad t480电脑。(学习视频分享:linux视频教程)Linux 查看磁盘空间可以使用 df 和 du 命令。df命令df 以磁..._df -hl

Office & delphi_range[char(96 + acolumn) + inttostr(65536)].end[xl-程序员宅基地

文章浏览阅读923次。uses ComObj;var ExcelApp: OleVariant;implementationprocedure TForm1.Button1Click(Sender: TObject);const // SheetType xlChart = -4109; xlWorksheet = -4167; // WBATemplate xlWBATWorksheet = -4167_range[char(96 + acolumn) + inttostr(65536)].end[xlup]

若依 quartz 定时任务中 service mapper无法注入解决办法_ruoyi-quartz无法引入ruoyi-admin的service-程序员宅基地

文章浏览阅读2.3k次。上图为任务代码,在任务具体执行的方法中使用,一定要写在方法内使用SpringContextUtil.getBean()方法实例化Spring service类下边是ruoyi-quartz模块中util/SpringContextUtil.java(已改写)import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.s..._ruoyi-quartz无法引入ruoyi-admin的service

CentOS7配置yum源-程序员宅基地

文章浏览阅读2w次,点赞10次,收藏77次。yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。可以这么说,yum 是改进型的 RPM 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题。yum 在服务器端存有所有的 RPM 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 RPM 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 RPM 包并进行安装。_centos7配置yum源

智能科学毕设分享(算法) 基于深度学习的抽烟行为检测算法实现(源码分享)-程序员宅基地

文章浏览阅读828次,点赞21次,收藏8次。今天学长向大家分享一个毕业设计项目毕业设计 基于深度学习的抽烟行为检测算法实现(源码分享)毕业设计 深度学习的抽烟行为检测算法实现通过目前应用比较广泛的 Web 开发平台,将模型训练完成的算法模型部署,部署于 Web 平台。并且利用目前流行的前后端技术在该平台进行整合实现运营车辆驾驶员吸烟行为检测系统,方便用户使用。本系统是一种运营车辆驾驶员吸烟行为检测系统,为了降低误检率,对驾驶员视频中的吸烟烟雾和香烟目标分别进行检测,若同时检测到则判定该驾驶员存在吸烟行为。进行流程化处理,以满足用户的需要。

随便推点

STM32单片机示例:多个定时器同步触发启动_stm32 定时器同步-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏14次。多个定时器同步触发启动是一种比较实用的功能,这里将对此做个示例说明。_stm32 定时器同步

android launcher分析和修改10,Android Launcher分析和修改9——Launcher启动APP流程(转载)...-程序员宅基地

文章浏览阅读348次。出处 : http://www.cnblogs.com/mythou/p/3187881.html本来想分析AppsCustomizePagedView类,不过今天突然接到一个临时任务。客户反馈说机器界面的图标很难点击启动程序,经常点击了没有反应,Boss说要优先解决这问题。没办法,只能看看是怎么回事。今天分析一下Launcher启动APP的过程。从用户点击到程序启动的流程,下面针对WorkSpa..._回调bubbletextview

Ubuntu 12 最快的两个源 个人感觉 163与cn99最快 ubuntu安装源下包过慢_un.12.cc-程序员宅基地

文章浏览阅读6.2k次。Ubuntu 12 最快的两个源 个人感觉 163与cn99最快 ubuntu下包过慢 1、首先备份Ubuntu 12.04源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表,有备无患嘛) 2、修改更新源 sudo gedit /etc/apt/sources.list (打开Ubuntu 12_un.12.cc

vue动态路由(权限设置)_vue动态路由权限-程序员宅基地

文章浏览阅读5.8k次,点赞6次,收藏86次。1.思路(1)动态添加路由肯定用的是addRouter,在哪用?(2)vuex当中获取到菜单,怎样展示到界面2.不管其他先试一下addRouter找到router/index.js文件,内容如下,这是我自己先配置的登录路由现在先不管请求到的菜单是什么样,先写一个固定的菜单通过addRouter添加添加以前注意:addRoutes()添加的是数组在export defult router的上一行图中17行写下以下代码var addRoute=[ { path:"/", name:"_vue动态路由权限

JSTL 之变量赋值标签-程序员宅基地

文章浏览阅读8.9k次。 关键词: JSTL 之变量赋值标签 /* * Author Yachun Miao * Created 11-Dec-06 */关于JSP核心库的set标签赋值变量,有两种方式: 1.日期" />2. 有种需求要把ApplicationResources_zh_CN.prope

VGA带音频转HDMI转换芯片|VGA转HDMI 转换器方案|VGA转HDMI1.4转换器芯片介绍_vga转hdmi带音频转换器,转接头拆解-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏2次。1.1ZY5621概述ZY5621是VGA音频到HDMI转换器芯片,它符合HDMI1.4 DV1.0规范。ZY5621也是一款先进的高速转换器,集成了MCU和VGA EDID芯片。它还包含VGA输入指示和仅音频到HDMI功能。进一步降低系统制造成本,简化系统板上的布线。ZY5621方案设计简单,且可以完美还原输入端口的信号,此方案设计广泛应用于投影仪、教育多媒体、视频会议、视频展台、工业级主板显示、手持便携设备、转换盒、转换线材等产品设计上面。1.2 ZY5621 特性内置MCU嵌入式VGA_vga转hdmi带音频转换器,转接头拆解

推荐文章

热门文章

相关标签