非常教程

Ruby 2.4参考手册

Fiddle

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
Fiddle
Fiddle::BasicTypes 详细
Fiddle::Closure 详细
Fiddle::Closure::BlockCaller 详细
Fiddle::CompositeHandler 详细
Fiddle::CParser 详细
Fiddle::CStruct 详细
Fiddle::CStructBuilder 详细
Fiddle::CStructEntity 详细
Fiddle::CUnion 详细
Fiddle::CUnionEntity 详细
Fiddle::DLError 详细
Fiddle::Function 详细
Fiddle::Handle 详细
Fiddle::Importer 详细
Fiddle::Pointer 详细
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct