编写你的应用程序(六)、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

智能推荐

怎么把服务器信号投到笔记本电脑上,笔记本怎么连接投影仪 笔记本连接投影仪无信号解决方法...-程序员宅基地

文章浏览阅读911次,点赞4次,收藏3次。摘要:在培训、开会时经常需要把笔记本连接投影机,让投影机演示笔记本的内容。那么笔记本电脑怎么连接投影仪?笔记本连接投影仪无信号怎么办?其实投影仪连接笔记本过程非常简单,下面来看看详细介绍。【笔记本投影仪】笔记本电脑怎么连接投影仪 笔记本连接投影仪无信号怎么办在需要使用 投影仪 的时候,出现投影仪连接笔记本无信号故障实在不是一件什么好事,耽误了正事可就麻烦了。下面来看看解决方法吧,也能以备不时之需。...

OpenHarmony应用分发运营体系-程序员宅基地

文章浏览阅读560次。开放原子开源基金会OpenHarmony 底座基础。华为HarmonyOS AGC 1+8+N。软通动力SwanLinkOS 开发板 设备。深开鸿KaiHongOS 开发板 设备。图片来源:OpenHarmony官网。润和HiHopeOS 开发板 设备。开鸿智谷在鸿OS 开发板 设备。

基于OpenCV的机器学习(十)神经网络_openmv是基于opencv算法研发的吗-程序员宅基地

文章浏览阅读413次。神经网络神经网络(Neural Networks)是一种模仿生物神经系统的机器学习算法。与生物神经系统相似,人工神经网络也由若干个神经元构成。_openmv是基于opencv算法研发的吗

MySQL卸载重新安装会遇到的问题及解决方式_mysql删除重装一堆问题-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏6次。好家伙,全踩雷了:一.使用cd命令无法进入到其他盘符?解决:在cd后加/d,两者之间用空格隔开二.初始化时没有给出密码?解决:仔细检查my.ini配置文件中的配置命令,一般是配置命令写错导致的三.安装时显示服务已经存在?解决:使用sc delete mysql命令删除已存在服务,之后重新进行安装四.安装时显示拒绝安装?解决:以管理员身份重新打开cmd,不是管理员无权做服务安装的操作五.启动时显示无法启动,没有报告任何错误?解决:导致这个问题的原因可能是你手动创建了data文件夹,删.._mysql删除重装一堆问题

第一章es安装和简单配置_es-client安装包-程序员宅基地

文章浏览阅读636次。1、官网下载es安装包 地址:https://www.elastic.co/downloads/elasticsearch解压目录结构如下2、进入目录执行elasticsearch-7.10.2 执行命令 bin/elasticsearch[2021-03-09T11:01:33,864][INFO ][o.e.n.Node ] [localhost] version[7.10.2], pid[12496], build[default/tar/747e1cc71de_es-client安装包

poj --1011_poj - 1011-程序员宅基地

文章浏览阅读498次。#include#includeusing namespace std;const int Max = 65;int n, len, stick[Max];bool flag, vis[Max];bool cmp(int a, int b){ return a > b;}void dfs(int dep, int now_len, int_poj - 1011

随便推点

VSCode调试JavaScript代码方法_vs code javascript调试-程序员宅基地

文章浏览阅读6.3k次,点赞3次,收藏25次。继续/暂停F5单步跳过F10单步调试F11单步跳出Shift + F11重启Ctrl + Shift + F5停止Shift + F5_vs code javascript调试

(二)Socket实战——安装开发工具IDEA_用idea实现 socket编程实现client/ server程序-程序员宅基地

文章浏览阅读3.7k次,点赞9次,收藏42次。首次利用IDEA的gradle实现socket编程的java文件,实现客户端和服务端的通信_用idea实现 socket编程实现client/ server程序

Linux 下Mysql 完全卸载_linux卸载mysql vim/etc/profile bashrc-程序员宅基地

文章浏览阅读304次。Linux 平台下卸载Mysql如何在Linux下卸载MySQL数据库呢? 下面总结、整理了一下Linux平台下卸载MySQL的方法。 MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries)、RPM包安装、源码安装。对应不同的安装方式,卸载的步骤有些不同。这里只写二进制包的卸载步骤。1、检查Mysql服务并关闭服务进程首先通过进程查看是否有MySQ..._linux卸载mysql vim/etc/profile bashrc

idea报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:_idea failed to execute goal org.apache.maven.plugi-程序员宅基地

文章浏览阅读5.2k次。仅供参考原文链接https://blog.csdn.net/fanrenxiang/article/details/80864908今天项目用maven命令打包时候抛出错误:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project springbootdemo: Fatal error compiling: 无效的标记: -_idea failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3

【图像处理】频域中的傅里叶变换和滤波(Matlab实现)-程序员宅基地

文章浏览阅读346次,点赞8次,收藏8次。在图像处理中,傅里叶变换可以将图像表示为其频率分量的叠加。傅里叶变换将图像从空间域(像素值的分布)转换为频率域(不同频率的成分)。这使得我们能够分析图像中不同频率的特征,如纹理、边缘等。[1]王非凡,陈希爱,任卫红等.基于图像自适应增强的低照度目标检测算法[J/OL].计算机工程:1-13[2024-03-11].https://doi.org/10.19678/j.issn.1000-3428.0068407.文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

ArcGis定义坐标系_aicgis中定义投影成功的-程序员宅基地

文章浏览阅读4.7k次。1.连接文件夹2.arctoolbox右下角出现 定义投影成功现象若出现图层锁死现象:要数据的可以私聊我_aicgis中定义投影成功的

推荐文章

热门文章

相关标签