Ruby 2.4

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