当前位置: 首页 > news >正文

免费数据源网站快速增加网站权重

免费数据源网站,快速增加网站权重,qq群文件wordpress,深圳建筑设计平台网站1 lua vs C/C lua是脚本语言#xff0c;优点是门槛低#xff0c;可以热更新#xff0c;缺点当然就是性能。C/C是编译型语言#xff0c;有点是性能高#xff0c;但是相对的#xff0c;门槛高#xff0c;技术不好的人写的代码可能还没有lua的性能高#xff0c;容易出现c…1 lua vs C/C lua是脚本语言优点是门槛低可以热更新缺点当然就是性能。C/C是编译型语言有点是性能高但是相对的门槛高技术不好的人写的代码可能还没有lua的性能高容易出现core不能热更新。 不过lua语言本身就是用C实现的而且可以将很多能力封装成lua的接口供lua调用。 2 C/C如何给lua提供接口 查看一个lua模块的源代码会发现lua模块的实现中既包含lua代码也包含C代码其中C代码的主要逻辑就是获取参数调用系统调用返回值C代码会编译为so供lua调用而lua代码就是将C代码提供的一些接口进行再封装以便在lua中更好用更简单然后再通过lua代码对外提供接口。因此这么看起来通过lua调用C函数重要的就是在C中如何获取参数以及如何返回值。 下面的说明以linotify项目进行说明。 2.1 lua模块的查找 当在lua里面通过require(“inotify”)时lua怎么知道去哪里查找inotify模块呢此时inotify模块是个lua脚本还是个so呢 跟其他脚本语言类似lua中也是通过变量来控制模块的查找的其中package.path是搜索lua模块的路径package.cpath是搜索so模块的路径先查找lua模块再查找so模块。 通过上面这种方式在当前目录找到了inotify.so。 2.2 so的入口 要调用inotify.so中的函数肯定还是要用动态库的函数dlopen、dlsym。例如当调用require(“inotify”)时如果没有导入inotify.so则调用dlopen加载inotify.so库 当在lua中调用local wd handle:addwatch(/home/rob/, inotify.IN_CREATE, inotify.IN_MOVE)时会调用handle_add_watch()函数。 2.3 参数获取 lua和C之间是通过栈进行交互的当调用C函数时C函数的第一个参数是lua_State的指针可以将它理解为lua的一个状态机。 如果要调用函数第一步就是参数的获取lua会将参数放到栈中因此inotify.so中的函数可以获取栈中的数据得到参数 fd get_inotify_handle(L, 1);path luaL_checkstring(L, 2);top lua_gettop(L);for (i 3; i top; i) {mask | (uint32_t)luaL_checkinteger(L, i);}get_inotify_handle()获取栈中的第1个参数luaL_checkstring(L, 2)获取栈中的第2个参数且第2个参数是个字符串然后通过lua_gettop(L)获取所有的参数的个数再用for循环将剩余的参数通过位或放到mask变量。通过这种方式就分别得到了addwatch()的三个参数。 然后再调用inotify的inotify_add_watch()完成实际的逻辑。 2.5 返回值 当具体的业务逻辑完成后就需要将返回值传给lua依旧是通过入栈的方式。 在这里调用完inotify_add_watch()就得到某个监听操作的描述符也需要将这个描述符返回如果操作成功调用lua_pushinteger(L, wd)将wd返回如果操作失败则返回3个值 static int handle_error(lua_State *L) {lua_pushnil(L);lua_pushstring(L, strerror(errno));lua_pushinteger(L, errno);return 3; }第1个是nil第2个是错误信息第3个是错误码。 因此在lua中可以这样来调用 local wd, err_info, errno handle:addwatch(/home/rob/, inotify.IN_CREATE, inotify.IN_MOVE) if wd nil thenprint(ERROR, err_info) end同时还需要注意handle_add_watch()函数的返回值返回值表明了lua中函数返回值的个数。例如这里成功时只返回描述符因此函数返回值是1失败时多了额外的错误信息因此函数返回值是3。 2.6 一个小的demo 有了上面的了解可以实现我们的一个小小的demo。 假设我们要实现一个加法操作实际的加法操作在C中完成然后在lua中调用。 #include lua.h #include lauxlib.hstatic int handle_add(lua_State *L) {int a, b, c;a luaL_checkinteger(L, 1);b luaL_checkinteger(L, 2);c a b;lua_pushinteger(L, c);return 1; }static luaL_Reg funcs[] {{add, handle_add},{NULL, NULL} };int luaopen_demo(lua_State *L) {lua_createtable(L, 0, sizeof(funcs)/sizeof(luaL_Reg) - 1);luaL_setfuncs(L, funcs, 0);return 1; }那这里的入口函数就是luaopen_demo()里面就调用了两个函数先调用lua_createtable创建 将上面的代码编译为so gcc demo.c -fPIC -shared -o demo.solua中调用 local demo require(demo)print(demo.add(2, 3))3 lua FFI lua C API实现lua的模块使用的是虚拟栈的方式实现起来太过麻烦用户需要使用一种新的接口C API和模式虚拟栈实现而使用FFI机制就可以在lua中直接调用C函数。 3.1 一个小例子 local ffi require(ffi) ffi.cdef[[ int printf(const char*fmt, ...); ]]ffi.C.printf(hello %s, world);首先加载ffi模块然后使用cdef添加C函数的声明有点类似于C语言中的头文件然后就可以调用ffi.C中的printf函数。然后就可以使用luajit编译luajit hell.lua。 3.2 调用so 上面的例子是调用C标准库中的函数如果需要调用其他的so文件呢 // libtest.c #include stdio.hint show(char *str) {int ret 0;if(str NULL) {ret -1;} else {printf(input: %s\n, str);}return ret; }# 将上述代码编译为so gcc -shared -fPIC libtest.c -o libtest.so然后就可以在lua中调用 local ffi require(ffi)-- 加载libtest.so local myffi ffi.load(test)-- 声明函数原型 ffi.cdef[[ int show(char *str); ]]local str1 hello-- 将字符串类型转换为char* local str2 ffi.cast(char *,str1)-- 调用libtest.so中的show函数 print(myffi.show(str2))4 C API vs FFI FFI相比C API最大的优势就是比较好理解性能高但是使用FFI也存在一些兼容性的问题而C API由于是官方提供的接口在稳定性方面还是很好的。 5 参考文档 FFI Tutorial
http://www.dnsts.com.cn/news/146263.html

相关文章:

  • 微信公众平台网页网站建设优化seo
  • 免费外贸网站模板下载旅游网站界面设计
  • 网站建设 超薄网络网站建站 seo
  • 上海羚凯网站建设1688自然排名怎么做好
  • 没备案的网站怎么做淘客如何查看网站是什么语言做的
  • 手机好在百度做网站吗wordpress 跳转 计数
  • 电子商务网站推广方法网站自己可以备案吗
  • 网站策划过程互动的网站建设
  • 保定网站设计多少钱wordpress cosy主题
  • 如何给网站添加网站地图天元建设集团有限公司鹿腾
  • 响应式网站用什么单位乐清建站公司
  • 移动端网站开发的书医院网站做品牌推广需要哪些
  • 网站 申请学校官方网站
  • 网站app下载平台怎么做wordpress 读书主题
  • 腾讯云网站安全认证网站建设 绍兴的公司哪家好
  • 网站设计 wordpress公司招聘信息
  • 商城微网站建设多少钱软件论坛网站有哪些
  • 网站一次性链接怎么做的上海响应式网站建设推荐
  • 沈阳市城市建设局网站网站诚信认证怎么做
  • 无锡网站建设公司排名整站优化关键词排名
  • 499元做网站建设网站有什么作用
  • 网站中的搜索框怎么做cad使用视频在线观看
  • 手机管理网站模板下载软件pc网站的优势
  • 网站后台服务网站建设的前期投入
  • 宜宾网站制作免费发布出租房信息网站
  • 江苏省建设监理协会网站网站建设伍金手指下拉6
  • wordpress可以做下载站做视频哪个网站素材好
  • 钓鱼网站怎么制作html敦煌网外贸平台
  • 深圳网站建设效果深圳信息网
  • 做亚马逊网站的账务处理以下什么是网页制作软件