1
反対方向にdriver_output_term
相当のものがありますか?つまり、最初にiolistに変換せずにErlangの用語をドライバに送信しますか?もしそうでなければ、私はおそらくterm_to_binary
を使って私の言葉を変換し、ei
とCの側でそれを解析する必要があります。良い例?Erlangドライバの代わりにiolistsを送信
反対方向にdriver_output_term
相当のものがありますか?つまり、最初にiolistに変換せずにErlangの用語をドライバに送信しますか?もしそうでなければ、私はおそらくterm_to_binary
を使って私の言葉を変換し、ei
とCの側でそれを解析する必要があります。良い例?Erlangドライバの代わりにiolistsを送信
ドキュメントによれば、iodata()
形式のものしか送信できません。
Erlangのドキュメントのthis tutorialのように、ドライバに送信するすべてが整数と文字列の場合は、独自のterm-to-iodataエンコーディングを使用する方が効率的(かつ簡単になる)かもしれません。彼らは関数を使用して、呼び出しを直接ドライバに送ることができるマッピングに変換するので、term_to_binary()
を使ってエンコードする必要はありません。 X
とY
が小さな整数であると想定される場合
encode({foo, X}) -> [1, X];
encode({bar, Y}) -> [2, 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);
}
残念ながら、私の用語は、 'ei'を使用して簡単にあることを十分に複雑です。 –