阅读更多

9顶
1踩

编程语言

原创新闻 Ruby FFI - Ruby调用C库最棒的工具

2008-11-02 00:40 by 见习编辑 robbin 评论(6) 有15487人浏览
Ruby解析器的性能一向被人垢病,很多性能敏感的程序,都必须用C语言来编写,然后使用Ruby去调用C库。但糟糕的是,Ruby调用C库并不是一件轻松的活,需要你对Ruby的内部数据结构有比较深入的了解,甚至需要你仔细阅读Ruby相关的源代码,然后用C语言编程作为黏合剂,用Ruby特有的C API去给外部的C库增加一层封装。

以上的过程,相当于你要打开Ruby解析器的内部进行API调用了,对程序员的要求很高。而且一旦Ruby内部的数据结构随着版本升级发生变动,你的这些黏合剂程序就必须重写。比方说现在Ruby 1.9出来以后,绝大部分Ruby的C扩展库统统无法正常编译。

基于以上这些原因,给Ruby写C的扩展库一件非常痛苦的事情,而且也是Ruby社区程序员一直抱怨的问题之一。然而随着FFI的出现,我们即将告别这些痛苦的历史!

FFI即Foreign Function Interface,外部函数调用接口,并非Ruby独有的概念,只不过因为Ruby扩展库带来的痛苦,使得Ruby的FFI显得格外迫切。FFI最早已经在Rubinius虚拟机平台上实现了,随后在JRuby上面也得以实现,而今天:2008年11月1日,在Ruby官方版本的解析器Ruby 1.8.6/1.8.7和1.9版本上也可以使用FFI了。

安装FFI很简单:

gem install ffi


使用FFI也很简单,比方说调用C语言标准库的printf函数,我们可以这样来写:

require 'ffi'
module MyExtModule
  extend FFI::Library
  attach_function :printf, [:string], :void
end

MyExtModule.printf("Hello FFI\n")


用attach_fuction就可以把C语言标准库的printf函数绑定到ruby里面来了,后面的参数分别声明C函数的传入参数和返回值。如果需要引入其他C库,可以预先使用ffi_lib指定库的名称。(我使用ffi_lib未能绑定非标准库,有可能是FFI的bug?也有可能是我没有设置对?)

有了FFI,在Ruby语言里面调用C库,就变成了一件异常轻松的事情,完全不需要ruby程序员再去吭哧吭哧啃C语言了,只要你手里捧着C库的API手册能看清楚函数的参数定义就够用了,然后你就可以直接在ruby里面随心所欲的调用它了,在调用之前,只需要用attach_function进行一次函数绑定声明即可。这对于整个ruby社区来说是一件非常棒的好消息。

在FFI的源代码树的samples目录下面还有几个小例子,大家可以自己看看:http://kenai.com/projects/ruby-ffi/sources/723/show

作为一个对比,我们来看看传统的ruby扩展库是如何调用C库的吧。以上面的为例,如果我们希望在ruby里面使用C库的printf函数,那么要先用ruby API的格式来写一段C代码去封装它:

#include <ruby.h>
 
static VALUE
dummy_printf(VALUE self, VALUE format, VALUE num)
{
    int rlt = printf(RSTRING_PTR(format), NUM2INT(num));
    return INT2FIX(rlt);
}
 
void Init_printf()
{
    /* register the method to the Kernel module */
    rb_define_method(rb_mKernel, "dummy_printf",
                     RUBY_METHOD_FUNC(dummy_printf), 2);
}


当然你必须对ruby.h里面定义的ruby内部数据结构和ruby内部的函数调用有充分的了解。然后你要创建一个extconf.rb文件:

require 'mkmf' 
create_makefile('printf')


运行这个文件:ruby extconf.rb,会创建出来编译这段C代码的Makefile,然后你再编译和安装,最终这个共享链接库会被拷贝到你的ruby的本地扩展库目录下面。最后你才可以在ruby里面调用这个封装好的dummy_printf方法。

另外,对于通过FFI去调用比较复杂的C库的时候,会涉及到不同语言之间的数据类型转换问题,关于数据类型的对照表,以及FFI使用更详细的介绍请看张驰原(他也是rmmseg的作者)的文章:http://pluskid.lifegoo.com/?p=370
9
1
评论 共 6 条 请登录后发表评论
6 楼 ray_linn 2011-12-31 17:41
用fiddle好了
5 楼 danielking 2008-11-04 18:02
swig也不错啊, 可能稍稍复杂一点, 但是swig有个好处就是一次定义好了就能生成好多种语言都能调用的库
4 楼 robbin 2008-11-04 13:48
wooce 写道

dlx库跟FFI有什么区别? 哪个好一些?

dlx库已经死掉了,两年多没有任何新版本发布。FFI是刚刚出来的新东西,同时支持Ruby,JRuby,Rubinius,你说哪个好?
3 楼 wooce 2008-11-04 11:30
dlx库跟FFI有什么区别? 哪个好一些?
2 楼 Magicloud 2008-11-03 09:43
作者不知道有个叫dlx的库吗。
1 楼 cookoo 2008-11-02 03:57
哇,这么傻瓜.

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 掉线报警 检测多个IP地址通断

    自动检测多个IP地址,自动检测每个ip记录断线时间,有日志文件

  • Ip冲突检测

    有一个IP地址冲突意味着有一个以上的网络设备或计算机的IP地址相同。在给服务器配置IP的时候,如果前期没有做好IP地址规划,IP地址使用明细登记,有可能就将已再用的IP又分配给另一台服务器。 那么怎么检测 IP地址冲突呢? 可以使用arp-scan工具。该工具在局域网内发送ARP数据包,来收集IP和MAC地址信息。如果一个IP地址对应多个MAC地址,就说明IP冲突了。 1. 安装

  • IP 地址冲突检测工具

    IP 冲突是一个术语,用于表示同一网络或子网中尝试使用相同 IP 地址的两个或多个设备的状态,这可能会导致发往特定主机的通信与其他主机混淆,因为两者都使用相同的 IP,为了避免这种情况,某些主机在发生 IP 冲突时会失去网络连接。

  • 局域网ip冲突检测工具_如何查询局域网内在用的IP地址?

    局域网查看在用的IP地址,对IP地址进行管理,是网管人员的基本操作。我常用的方式有两种:登陆交换机查看,通过nmap等扫描工具查看。下面对这两种方式分别说一说。登陆交换机查看登陆网关交换机查看arp信息,这里需要注意的是接入交换机是不记录IP信息的,需要登陆网关交换;每台终端上网必须要设置一个网关地址,是数据转发的第一跳,在这台网络设备上记录了终端的相关arp信息,即mac地址和ip地址...

  • 5个好用的网络故障排除工具分享

    网络排障作为每个网工的必备基础,如果能好用的网络故障排除工具高效提升你的工作效率,对于领导来说,绝对是加分项。

  • 排查MAC地址是否冲突——arping工具详解

    arping是一个强大的网络诊断工具,特别适用于局域网内的设备检测和故障排除。通过ARP请求和响应,arping能够验证IP地址和MAC地址之间的映射关系,检测网络中的MAC地址冲突,并测试网络连通性。无论是网络管理员还是普通用户,都可以利用arping更好地了解和管理本地网络环境。

  • 【C#】Byte[]、Image、Bitmap 之间的相互转换

    原文地址:https://www.cnblogs.com/zhangwei99com/p/7756291.html

  • 局域网IP地址非法使用问题的解决方法

    在大多数局域网的运行管理工作中,网络管理员负责管理用户IP地址的分配,用户通过正确地注册后才被认为是合法用户。在局域网上任何用户使用未经授权的IP地址都应视为IP非法使用。但在Windows操作系统中,终端用户可以自由修改IP地址的设置,从而产生了IP地址非法使用的问题。改动后的IP地址在局域网中运行时可能出现的情况如下。??      a. 非法的IP地址即IP地址不在...

  • 局域网ip冲突检测工具_【网络工程师】局域网技术重点总结!

    一、本次课程总结【课堂名称】局域网技术【重点内容】以太网、冲突域和广播域。【视频回看地址】2019希赛网-网络工程师3月25号直播课堂:(长按识别,即可查看)【内容详解】二、以太网CSMA/CD以太网的核心技术是带冲突检测的载波侦听多路访问(CSMA/CD)方法。CSMA/CD的发送流程可以简单的概括为4点:1.载波侦听过程根据监听到介质状态后采取的回避策略可将CSMA分为下面几种:非坚持型CSM...

  • IP地址冲突检测(Address Conflict Detect)记录

    用于检测IP地址冲突,发送端IP填充为0,填充为0是为了避免对其他设备的ARP cache造成污染(ARP probe报文不会使局域网中的其他设备刷新ARP映射关系,若已经有设备正在使用目标IP地址了,其通信不会受影响)。ARP通告分组:与ARP探测相同,除了其发送方协议地址和目的协议地址字段被填充为候选IPv4地址外。2、ARP协议(地址解析协议)用于局域网中网络设备按IP地址查询对方的MAC地址,提供一种从网络地址(仅ipv4,ipv6用ND协议替代)到硬件地址(各种链路层协议使用的地址)的映射。

  • 校园网上网帐号被盗事件的分析与防范

    校园网给学校的师生员工带来便利的同时,也产生了上网帐号的安全问题。近期我们接到投诉上网账号被他人占用的事件数量呈上升趋势,经过分析上网记录数据,可能还存在更多用户在毫不知情的情况下帐号被人盗用的情况。我校的上网帐号采用实名制,上网认证采用NAT+LDAP方式,访问校外网时要安装安全证书,还要在专用的客户端输入帐号名和密码。上网帐号为何频繁被盗呢?1、账号被盗事件五月中的一天...

  • 如何有效地解决校园网络IP地址冲突问题

      随着高校数字化校园网络的广泛应用,校内机器增多,无线网络的覆盖,相应的IP地址分配也在不断增多,IP地址冲突现象与日俱增,在一定程度上影响了网络的正常运行。    《计算机科学与应用》期刊上有篇文章从基础网络管理和网络技术管理两方面入手,提出了一项解决方案,解决校园网IP地址冲突问题,提高校园网网络管理、安全管理以及维护效率。    发生IP冲突的主要原因:1)用户不熟悉TCP/IP的原理,不...

  • 内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持

    ARP(Address Resolution Protocol)是一种TCP/IP协议,用于根据IP地址获取物理地址。在计算机发送信息时,如果需要知道目标IP地址的物理地址,就会使用ARP协议。该协议会通过将目标IP地址广播到局域网上的所有主机,并接收返回的消息来获取目标物理地址。一旦收到返回的消息,计算机就会将该IP地址和物理地址存入本机ARP缓存中,以便下次请求时直接查询,从而节约资源。

  • 关于局域网中IP地址被盗用的探讨

    转载自品略图书馆http://www.pinlue.com/article/2020/03/2512/5710052114625.html 摘要:对于在Internet和Intranet网络上,使用TCP/IP协议时每台主机必须具有独立的IP地址,有了IP地址的主机才能与网络上的其他主机进行通信。随着网络应用大力推广,网络客户急剧膨胀,由于静态IP地址分配,IP地址冲突的麻烦相继而来。...

  • 什么是IP地址盗用?又要如何预防?

    IP地址是由互联网编号分配机构(IANA,Internet AssignedNumbersAuthority)先把IP地址分给各大洲的机构,然后各大洲的机构把IP地址分给运营商,再由运营商把固定的IP地址分配给用户。 假如出现分配的IP地址和设备不匹配的话,就有可能出现IP地址盗用的情况。 首先我们要先了解几种不同的IP地址盗用类型。 1.IP地址静态盗用 该方法是指用户配置或者修改计算机IP设置时,使用他人合法IP地址或者未经合法分配的 IP地址,典型的例子是在用户非法入网和恶意隐藏自己.

  • 基于ARP的局域网IP劫持——C语言实现

    150 printf("success: device: %s\n", devStr); 151 } 152 else 153 { 154 printf("error: %s\n", errBuf); 155 exit(1); 156 } 157 158 /* open a device, wait until a packet arrives *

Global site tag (gtag.js) - Google Analytics