【问题标题】:How to use NIF to interact with C code that keeps state across calls (i.e., linked lists as NIF)如何使用 NIF 与跨调用保持状态的 C 代码交互(即,作为 NIF 的链表)
【发布时间】:2012-02-18 16:42:19
【问题描述】:

我想创建一个用 C 实现的链表数据结构。我的想法是创建一个链表

ll:new() -> listId.

上面的ListId 表示某种类型的“指针”,它将被传递回C 代码,该C 代码将用作列表上的某种类型的句柄。我希望不必来回传递列表本身,因为我想象列表可能会变得非常非常大。一旦创建了链表,用户就会以明显的方式与之交互:

ll:add(ListId, Elt)
ll:add_after(ListId, Pos, Elt)

我想我会通过 Erlang 的 NIF 功能来做到这一点。现在,为了使它工作,C 端必须在多次调用 add、add_after 等时维护列表。

在直接的 C 语言中,我将有一个用户与之交互的 main 函数,该函数将使程序保持活动状态,从而在用户与程序交互的整个生命周期内保持链接列表的持久性。据我了解,NIF 使用没有主要功能的 C 代码。也就是说,每次调用 NIF 都是一次性的命题。

谁能给我一些关于如何(假设它是适当的)可以利用 NIF 与需要在多个调用中保持状态的 C 代码交互的指示?我希望这很清楚!

【问题讨论】:

  • 只是为了澄清:ListId - 它包含某种形式的整个列表,或者只是引用(直接或间接)到 C 部分中的内存?
  • @OdobenusRosmarus,ListId 应该是对链表的引用,而不是链表本身

标签: erlang ffi erlang-nif


【解决方案1】:

检查the documentation 是否有资源对象。 NIF API 甚至允许您使用 erlang GC 来 GC 您创建的列表,以防创建它的进程崩溃!

【讨论】:

    【解决方案2】:

    C 中的“静态”变量可以在调用之间保持值,但我强烈不推荐这种方式。如果您需要一些状态,最好查看 erlang 中的“端口”。

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2014-12-19
      • 2012-09-17
      • 2016-03-30
      • 2015-07-08
      • 2013-01-17
      • 1970-01-01
      • 2020-05-17
      • 2014-12-17
      相关资源
      最近更新 更多