Erlang 如何使用NIF与保持调用状态的C代码交互(例如,作为NIF的链表)

Erlang 如何使用NIF与保持调用状态的C代码交互(例如,作为NIF的链表),erlang,ffi,erlang-nif,Erlang,Ffi,Erlang Nif,我想创建一个用C实现的链表数据结构。其想法是创建一个链表 ll:new() -> listId. 上面的ListId表示某种类型的“指针”,它将被传递回C代码,C代码将充当列表上某种类型的句柄。我希望不必来回传递列表,因为我想象列表会变得非常非常大。创建链表后,用户将以明显的方式与之交互: ll:add(ListId, Elt) ll:add_after(ListId, Pos, Elt) 我想我会通过Erlang的NIF功能来实现这一点。现在,为了实现这一点,C端必须在多个要添加的调

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

ll:new() -> listId.
上面的ListId表示某种类型的“指针”,它将被传递回C代码,C代码将充当列表上某种类型的句柄。我希望不必来回传递列表,因为我想象列表会变得非常非常大。创建链表后,用户将以明显的方式与之交互:

ll:add(ListId, Elt)
ll:add_after(ListId, Pos, Elt)
我想我会通过Erlang的NIF功能来实现这一点。现在,为了实现这一点,C端必须在多个要添加的调用、add_after等调用中维护列表

在straight C中,我将有一个用户与之交互的主函数,该函数将使程序保持活动状态,从而在用户与程序交互的生命周期中保持链表的持久性。据我所知,NIFs使用C代码,没有主函数。也就是说,对NIF的每个调用都是一个“一个完成”类型的命题


有没有人能给我一些建议,告诉我如何(假设合适的话)利用NIF与需要在多个调用中保持状态的C代码进行交互?我希望这是清楚的

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

检查资源对象。NIFAPI甚至允许您在创建列表的进程崩溃时使用erlang GC来GC您创建的列表

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