【问题标题】:Passing a pointer to one C function as a parameter to another function将指向一个 C 函数的指针作为参数传递给另一个函数
【发布时间】:2015-01-23 05:15:23
【问题描述】:

我正在使用FFI gem,以便我可以直接从我的Ruby 程序访问C 库中的函数。如果 C 库有一个接受函数指针参数的函数,并且它有第二个函数具有正确的签名在该参数中,那么我如何将指向第二个函数的指针作为参数传递给第一个函数?

我尝试了什么

这是我迄今为止尝试过的。为了简化事情,我在一个名为bar.c 的文件中编写了自己的非常简单的 C 库:

#include <stdio.h>

typedef int bar_func();

int bar1()
{
    return 7;
}

int bar2(bar_func * f)
{
    printf("f=%p, bar2=%p\n", f, bar1);
    return f() + f();
}

我在 Arch Linux 下通过运行 gcc -std=gnu99 -fPIC -shared bar.c -o bar.so 编译它

我的目标是将指向bar1 的指针作为参数传递给bar2。我希望bar2 打印两个相同的指针,然后返回 14。

所以我使用 Ruby 2.2.0p0 和 ffi 1.9.6 运行了这个程序:

require 'ffi'

module Bar
  extend ::FFI::Library
  ffi_lib './bar.so'
  callback :bar_func, [], :int
  attach_function :bar1, [], :int
  attach_function :bar2, [:bar_func], :int

  puts bar2(method(:bar1))   # => 14
end

当我运行程序时,这是我得到的输出:

f=0x7f563ce46000, bar1=0x7f563af7d6e0
14

它给出了正确的返回值,但是你可以看到传入bar2函数的函数指针显然不等于bar1,因为第一行打印的两个函数指针是不同的。

【问题讨论】:

    标签: ruby ffi


    【解决方案1】:

    我在FFI::Library documentation 中看到了提示。它说attach_function 返回一个FFI::VariadicInvoker 对象。我做了一个有根据的猜测,您可以将它而不是 proc 传递给它,并且它起作用了。

    module Bar
      extend ::FFI::Library
      ffi_lib './bar.so'
      callback :bar_func, [], :int
      Bar1Invoker = attach_function :bar1, [], :int
      attach_function :bar2, [:bar_func], :int
    
      puts bar2(Bar1Invoker)   # => 14
    end
    

    我得到了想要的输出:

    f=0x7f949ed7d6e0, bar1=0x7f949ed7d6e0
    14
    

    我已编辑 FFI wiki 上的 Callbacks 页面以获取此信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 2012-09-10
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多