向 Erlang 驱动程序发送术语而不是 iolists

发布于 2024-10-03 07:35:23 字数 270 浏览 1 评论 0原文

是否有相当于 driver_output_term 的内容其他方向,即将 Erlang 术语发送给驱动程序而不首先将其转换为 iolist?如果没有,我大概应该使用 term_to_binary 转换我的术语,并使用 ei 在 C 端解析它;有什么好的例子吗?

Is there an equivalent of driver_output_term in the other direction, i.e. sending an Erlang term to the driver without converting it to an iolist first? If not, I presumably should convert my term using term_to_binary and parse it on the C side with ei; any good examples?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凶凌 2024-10-10 07:35:23

根据文档,您只能发送 iodata() 格式的内容。

如果您想要发送到驱动程序的只是整数和字符串,那么使用您自己的 term-to-iodata 编码可能会更有效(并且更容易),如 本教程来自 Erlang 文档。它们使用函数将调用转换为可以直接发送到驱动程序的映射,因此不需要使用 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);
}

According to the docs, you can only send stuff that's in iodata() format.

If all you want send to the driver is integers and strings, it might be more efficient (and a lot easier) to use your own term-to-iodata encoding, as in this tutorial from the Erlang documentation. They use a function to convert their calls to a mapping that can be sent to the driver directly and therefore doesn't need to be encoded using term_to_binary().

encode({foo, X}) -> [1, X];
encode({bar, Y}) -> [2, Y].

This mapping is feasible if X and Y are assumed to be small integers.
On the C side, the first byte of the input buffer is switched upon to call the appropriate function using the second byte as the argument:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文