1

driver_output_term反対方向、つまり最初に iolist に変換せずに Erlang 項をドライバに送信することと同等のものはありますか? そうでない場合は、おそらく ; を使用して用語を変換term_to_binaryし、C 側でei;を使用して解析する必要があります。良い例はありますか?

4

1 に答える 1

2

ドキュメントによると、iodata()フォーマットされたもののみを送信できます。

ドライバーに送信したいのが整数と文字列だけの場合は、Erlang ドキュメントのこのチュートリアルのように、用語から iodata への独自のエンコーディングを使用する方が効率的 (そしてはるかに簡単) かもしれません。関数を使用して、呼び出しをドライバーに直接送信できるマッピングに変換するため、 を使用してエンコードする必要はありませんterm_to_binary()

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

このマッピングは、 および が小さい整数であると想定される場合に実現可能XですY。C 側では、入力バッファーの最初のバイトがオンに切り替えられ、2 番目のバイトを引数として使用して適切な関数が呼び出されます。

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);
}
于 2010-11-30T00:50:41.873 に答える