Fiddle
module Fiddle
Ruby的libffi包装器。
描述
Fiddle 是用 ruby翻译外国功能界面(FFI)的扩展。
它包装了libffi,这是一个流行的C库,它提供了一个便携式界面,允许用一种语言编写的代码调用用其他语言编写的代码。
例
在这里,我们将使用Fiddle :: Function 从libm中包装floor(3)
require 'fiddle'
libm = Fiddle.dlopen('/lib/libm.so.6')
floor = Fiddle::Function.new(
libm['floor'],
[Fiddle::TYPE_DOUBLE],
Fiddle::TYPE_DOUBLE
)
puts floor.call(3.14159) #=> 3.0
常量
ALIGN_CHAR
ALIGN_CHAR
字符的对齐大小
ALIGN_DOUBLE
ALIGN_DOUBLE
双重对齐大小
ALIGN_FLOAT
ALIGN_FLOAT
浮动的对齐大小
ALIGN_INT
ALIGN_INT
int的对齐大小
ALIGN_INTPTR_T
ALIGN_INTPTR_T
intptr_t的对齐大小
ALIGN_LONG
ALIGN_LONG
long的对齐大小
ALIGN_LONG_LONG
ALIGN_LONG_LONG
long long的队列大小
ALIGN_PTRDIFF_T
ALIGN_PTRDIFF_T
ptrdiff_t的对齐大小
ALIGN_SHORT
ALIGN_SHORT
short的对齐大小
ALIGN_SIZE_T
ALIGN_SIZE_T
size_t的对齐大小
ALIGN_SSIZE_T
ALIGN_SSIZE_T
ssize_t的对齐大小
ALIGN_UINTPTR_T
ALIGN_UINTPTR_T
uintptr_t的对齐大小
ALIGN_VOIDP
ALIGN_VOIDP
void *的对齐大小
BUILD_RUBY_PLATFORM
BUILD_RUBY_PLATFORM
针对(即“x86_64-linux”等)构建的平台,
另见RUBY_PLATFORM
RUBY_FREE
RUBY_FREE
ruby_xfree()函数的地址
SIZEOF_CHAR
SIZEOF_CHAR
字符的大小
SIZEOF_DOUBLE
SIZEOF_DOUBLE
double的大小
SIZEOF_FLOAT
SIZEOF_FLOAT
float的大小
SIZEOF_INT
SIZEOF_INT
int的大小
SIZEOF_INTPTR_T
SIZEOF_INTPTR_T
intptr_t的大小
SIZEOF_LONG
SIZEOF_LONG
long的大小
SIZEOF_LONG_LONG
SIZEOF_LONG_LONG
long long的大小
SIZEOF_PTRDIFF_T
SIZEOF_PTRDIFF_T
ptrdiff_t的大小
SIZEOF_SHORT
SIZEOF_SHORT
short的大小
SIZEOF_SIZE_T
SIZEOF_SIZE_T
size_t的大小
SIZEOF_SSIZE_T
SIZEOF_SSIZE_T
ssize_t的大小
SIZEOF_UINTPTR_T
SIZEOF_UINTPTR_T
uintptr_t的大小
SIZEOF_VOIDP
SIZEOF_VOIDP
void*的大小
TYPE_CHAR
TYPE_CHAR
C type - char
TYPE_DOUBLE
TYPE_DOUBLE
C type - double
TYPE_FLOAT
TYPE_FLOAT
C type - float
TYPE_INT
TYPE_INT
C type - int
TYPE_INTPTR_T
TYPE_INTPTR_T
C type - intptr_t
TYPE_LONG
TYPE_LONG
C type - long
TYPE_LONG_LONG
TYPE_LONG_LONG
C type - long long
TYPE_PTRDIFF_T
TYPE_PTRDIFF_T
C type - ptrdiff_t
TYPE_SHORT
TYPE_SHORT
C type - short
TYPE_SIZE_T
TYPE_SIZE_T
C type - size_t
TYPE_SSIZE_T
TYPE_SSIZE_T
C type - ssize_t
TYPE_UINTPTR_T
TYPE_UINTPTR_T
C type - uintptr_t
TYPE_VOID
TYPE_VOID
C type - void
TYPE_VOIDP
TYPE_VOIDP
C type - void*
WINDOWS
返回一个关于主机是否为WIN32的布尔值
公共类方法
dlopen(library) → Fiddle::Handle Show source
创建一个打开库的新处理程序,并返回Fiddle :: Handle的一个实例。
如果为库指定了nil,则使用Fiddle :: Handle :: DEFAULT,这等同于RTLD_DEFAULT。 请参阅 man 3 dlopen。
lib = Fiddle.dlopen(nil)
缺省值取决于操作系统,并为已加载的所有库提供句柄。 例如,在大多数情况下,您可以使用它来访问libc函数或ruby函数,如rb_str_new。
有关更多信息,请参阅Fiddle :: Handle.new。
# File ext/fiddle/lib/fiddle.rb, line 45
def dlopen library
Fiddle::Handle.new library
end
dlunwrap(addr) Show source
返回内存指针地址 addr
的十六进制表示
例:
lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>
lib['strcpy'].to_s(16)
=> "7f59de6dd240"
Fiddle.dlunwrap(Fiddle.dlwrap(lib['strcpy'].to_s(16)))
=> "7f59de6dd240"
VALUE
rb_fiddle_ptr2value(VALUE self, VALUE addr)
{
return (VALUE)NUM2PTR(addr
}
dlwrap(val) Show source
返回函数十六进制地址位置val的内存指针
例:
lib = Fiddle.dlopen('/lib64/libc-2.15.so')
=> #<Fiddle::Handle:0x00000001342460>
Fiddle.dlwrap(lib['strcpy'].to_s(16))
=> 25522520
static VALUE
rb_fiddle_value2ptr(VALUE self, VALUE val)
{
return PTR2NUM((void*)val
}
free(addr) Show source
释放地址处的内存 addr
VALUE
rb_fiddle_free(VALUE self, VALUE addr)
{
void *ptr = NUM2PTR(addr
ruby_xfree(ptr
return Qnil;
}
last_error() Show source
返回当前正在执行的线程的最后一个错误,如果没有则返回nil
# File ext/fiddle/lib/fiddle.rb, line 20
def self.last_error
Thread.current[:__FIDDLE_LAST_ERROR__]
end
last_error=(error) Show source
将当前正在执行的线程的最后一个错误设置为错误
# File ext/fiddle/lib/fiddle.rb, line 25
def self.last_error= error
Thread.current[:__DL2_LAST_ERROR__] = error
Thread.current[:__FIDDLE_LAST_ERROR__] = error
end
malloc(size) Show source
分配size
内存字节并返回分配内存的整数内存地址。
static VALUE
rb_fiddle_malloc(VALUE self, VALUE size)
{
void *ptr;
ptr = (void*)ruby_xmalloc(NUM2SIZET(size)
return PTR2NUM(ptr
}
realloc(addr, size) Show source
将在内存位置addr分配的内存大小更改为大小字节。 返回重新分配的内存的内存地址,该地址可能与传入的地址不同。
static VALUE
rb_fiddle_realloc(VALUE self, VALUE addr, VALUE size)
{
void *ptr = NUM2PTR(addr
ptr = (void*)ruby_xrealloc(ptr, NUM2SIZET(size)
return PTR2NUM(ptr
}
win32_last_error() Show source
返回当前正在执行的Thread的最后一个win32错误,如果没有则返回nil
# File ext/fiddle/lib/fiddle.rb, line 9
def self.win32_last_error
Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
end
win32_last_error=(error) Show source
将当前正在执行的线程的最后一个win32错误设置为错误
# File ext/fiddle/lib/fiddle.rb, line 14
def self.win32_last_error= error
Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
end
私有实例方法
dlopen(library) → Fiddle::Handle Show source
创建一个打开库的新处理程序,并返回Fiddle :: Handle的一个实例。
如果为库指定了nil,则使用Fiddle :: Handle :: DEFAULT,这等同于RTLD_DEFAULT。 参阅 man 3 dlopen。
lib = Fiddle.dlopen(nil)
缺省值取决于操作系统,并为已加载的所有库提供句柄。 例如,在大多数情况下,您可以使用它来访问libc函数或ruby函数,如rb_str_new。
有关更多信息,请参阅Fiddle :: Handle.new。
# File ext/fiddle/lib/fiddle.rb, line 45
def dlopen library
Fiddle::Handle.new library
end