在另一个方向上是否有等价的driver_output_term
,即向驱动程序发送Erlang术语而不先将其转换为iolist?如果没有,我可能应该使用term_to_binary
转换我的术语,并使用ei
在C端解析它;有什么好的例子吗?
答案 0 :(得分:2)
根据文档,您只能发送iodata()
格式的内容。
如果你想要发送给驱动程序的只是整数和字符串,那么使用你自己的term-to-iodata编码可能会更有效(也更容易),就像Erlang文档中的this tutorial一样。它们使用函数将其调用转换为可以直接发送到驱动程序的映射,因此不需要使用term_to_binary()
进行编码。
encode({foo, X}) -> [1, X];
encode({bar, Y}) -> [2, Y].
如果假定X
和Y
为小整数,则此映射是可行的。
在C端,输入缓冲区的第一个字节被打开以使用第二个字节作为参数调用适当的函数:
static void example_drv_output(ErlDrvData handle, char *buff, int bufflen)
{
example_data* d = (example_data*)handle;
char fn = buff[0], arg = buff[1], res;
if (fn == 1) {
res = foo(arg);
} else if (fn == 2) {
res = bar(arg);
}
driver_output(d->port, &res, 1);
}