如何使用NIF与保持调用状态的C代码进行交互(即链接列表为NIF)

时间:2012-01-25 13:45:41

标签: erlang ffi erlang-nif

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

ll:new() -> listId.

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

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

我想我会通过Erlang的NIF功能来做到这一点。现在,为了实现这一点,C方必须在多个add,add_after等调用中维护列表。

在直接C中,我将拥有一个用户与之交互的主要功能,这将使程序保持活动状态,从而保持链表在用户与程序交互的生命周期中保持不变。据我了解,NIF使用的C代码没有主要功能。也就是说,每次调用NIF都是一种完成的命题。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

C中的'static'变量可以保持调用之间的值,但我强烈建议不要这样做。如果你需要一些状态,最好在erlang中查看'ports'。