Отправка терминов вместо iolists водителю Erlang - PullRequest
1 голос
/ 18 ноября 2010

Существует ли эквивалент driver_output_term в другом направлении, то есть отправке термина Erlang водителю без предварительного преобразования его в iolist?Если нет, я, вероятно, должен преобразовать мой термин, используя term_to_binary, и проанализировать его на стороне C с помощью ei;какие-нибудь хорошие примеры?

1 Ответ

2 голосов
/ 30 ноября 2010

Согласно документации, вы можете отправлять только то, что находится в формате 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...