阅读更多

9顶
1踩

编程语言

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

2008-11-02 00:40 by 见习编辑 robbin 评论(6) 有15524人浏览
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非法使用。但在Windows操作系统中,终端用户可以自由修改IP地址的设置,从而产生了IP地址非法使用的问题。改动后的IP地址在局域网中运行时可能出现的情况如下。??      a. 非法的IP地址即IP地址不在...

  • 局域网内如何盗用别人的IP上网

    现在很多局域网都根据IP地址的不同,给不同IP地址分配不同资源;或则网内自己ip由于一些原因被封掉,不能访问外网;这些时候可能我们可能就需要先借别人的IP用用了。下面分两种情况来介绍具体的方法:一、IP地址没有和网卡地址帮定简单,设置换个ip地址就行了。换个你想用的得IP,阿,不知道如何换? 我这里以windows2000为例,右键网上邻居,选属性, 右键本地连接,选属性,选 tcp/ip,属性然

  • IP地址盗用常用方法及防范

    目前IP地址盗用行为非常常见,许多“不法之徒”用盗用地址的行为来逃避追踪、隐藏自己的身份。IP地址的盗用行为侵害了网络正常用户的权益,并且给网络安全、网络的正常运行带来了巨大的负面影响,因此研究IP地址盗用的问题,找出有效的防范措施,是当前的一个紧迫课题。   IP地址盗用常用的方法及其防范机制   IP地址盗用是指盗用者使用未经授权的IP地址来配置网上的计算机。IP地址的盗用通常有以下两种方法:

  • 保护IP地址不被窃取的几种方法

    保护IP地址不被窃取需要采取多种措施。使用代理服务器、匿名登录、安全使用EMAIL以及安装杀毒软件等都是有效的保护方法。只有综合运用这些措施,才能更好地保护我们的IP地址不被窃取,从而保障个人和计算机的安全。

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

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

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

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

  • 有人能利用您的 IP 地址做什么?

    网络犯罪分子可以利用 IP 地址做什么以及如何防止他们将您的 IP 地址用于恶意目的。

  • 如何预防和处理他人盗用IP地址?

    解释 IP 地址在互联网中的作用。它是唯一标识网络设备的数字地址,类似于物理世界中的邮政地址。

  • IP地址被泄露了有什么安全隐患吗

    但是,当请求的数量超出了网站的处理能力,就像派对地点被过多的人挤满,没人能够再进去,网站就会变得无法访问 因为这些请求来自于很多不同的IP地址,对于网站来说,很难区分哪些是合法的访问,哪些是攻击。这样一来,黑客就可以监视你的所有网络活动,包括你输入的用户名、密码和其他敏感信息 中间人攻击的危害性在于,它不仅仅是被动的监听,而是可以主动介入和篡改通信。如果有人偷了你的车牌号,然后在另一辆车上使用它去做一些坏事,比如超速行驶,那么警察在追查车牌号时,找到的会是你,而不是真正的肇事者。

  • IP地址被盗用解决方案

    盗用IP地址也算是屡见不鲜的事情了,在IPV4的时代,IP地址是一种稀缺的资源,也由此衍生了盗用IP地址的做法;到到了IPV6时代,IPV6地址个数为16^32=2^128个,大约是3.4E38,以地球目前的容量来看,是不会耗尽的,但是对于某些按IP地址进行流量计费的网络来说,IP地址仍然显得稀缺,仍旧需要防范IP地址被盗用。   当局域网上有两台主机具有形同的IP地址,两台主机会相互报警,造成混乱。如何防范IP地址被盗用?   一、将IP地址与MAC地址进行捆绑   网卡在使用中有两类地址,一类是大

  • 关于局域网中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地址,典型的例子是在用户非法入网和恶意隐藏自己.

  • 如何彻底防止IP地址被盗

     单位所在局域网有100多台计算机,为了区分不同用户分配更详细的访问权限,我们采 用的是设置固定IP的方法,而不是自动获取IP地址,再就是我们还要有一部分要连到互联 网上。这样就要设两个子网如内网我们设为192.168.0.1网段,能连外网的我们设为192.1 68.1.1网段。在实际使用中遇到了经常有用户为了上网私自修改IP地址,从而造成网络冲 突的问题。表现如下:     因为我们的计算机都是

  • 如何解决网站限制IP访问的问题

    一、网站为何限制IP访问   有些网站为有效遏制数据爬取和非法攻击等行为,保证普通用户访问速度和查询效果,网站系统增加了网络安全设备,强化了安全防护机制,预先设置了安全访问规则。 经过分析,用户无法正常访问网站的主要条件有:一是用户电脑安装了第三方查询软件或插件,引起非人为的、高频次的访问系统而被限制访问;二是用户电脑所处共用公网IP地址内的其他电脑存在机器访问行为,多次触发禁止访问规则,造...

  • 局域网ip管理办法1-对乱用地址者封网

          我厂机关的一个用户ip地址被人盗用,发生冲突无法上网。对于这种乱用地址的行为我们应该通过有效的技术手段严厉的加以制止。对于现在的一些可网管的高性能交换机做到这点并非难事。我们可以关闭相应的端口,也可以在交换机上做包过滤。这个问题我是这样解决的:      首先在厂核心交换机上通过arp表找到了盗用地址者机器的mac地址,核心交换机为avaya p882,使用show arp 命令就可以

  • IP地址盗用技术简介及防范措施

    IP地址盗用技术简介及防范措施一、IP地址盗用方法分析   IP地址的盗用方法多种多样,其常用方法主要有以下几种:   1、静态修改IP地址   对于任何一个TCP/IP实现来 说,IP地址都是其用户配置的必选项。如果用户在配置TCP/IP或修改TCP/IP配置时,使用的不是授权机构分配的IP地址,就形成了IP地址盗用。由于IP地址是一个逻辑地址,是一个需要用户设置的值,因此无法限制用户对于IP地

Global site tag (gtag.js) - Google Analytics