2010-08-19 16 views

cevap

6

En yeni yaklaşım, NIF'leri http://www.erlang.org/doc/man/erl_nif.html (dikkatli olun, VM'ye çarpabilir) olarak değerlendirir. (Anti-spam tutar, çünkü bağlantıyı yukarı google) Normal yoldan

+3

nifs olan bağlantı noktasına veri gönderilen edebilirsiniz muhtemelen ne yaptığını bilmediğin sürece kaçınmak istediğin bir şey. Engelleyen bir şeye çağırırsan, Erlang'ın programlayıcısını havaya uçurdun. Çöküşüne bir şey çağırırsanız, eskiden sağlam Erlang'ınız patlayacak. –

21

Bu yapmanız ++ dosyaları C/C oluşturmanız gerekir

Öncelikle bir sürücü oluşturmak içindir o sürücüleri bağlantılı içerir yapmak o.

Onlar Sonra sürücü haritalayan

/* mapping of the drivers functions */ 
static ErlDrvEntry driver_entry = { 
    NULL,        /* init */ 
    startup_function_name,   /* startup */ 
    shutdown_function_name,   /* shutdown */ 
    NULL,        /* output */ 
    NULL,        /* ready_input */ 
    NULL,        /* ready_output */ 
    driver_name,      /* the name of the driver */ 
    NULL,        /* finish */ 
    NULL,        /* handle */ 
    NULL,        /* control */ 
    NULL,        /* timeout */ 
    outputv_function_name,   /* outputv */ 
    NULL,        /* ready_async */ 
    NULL,        /* flush */ 
    NULL,        /* call */ 
    NULL,        /* event */ 
    ERL_DRV_EXTENDED_MARKER,   /* ERL_DRV_EXTENDED_MARKER */ 
    ERL_DRV_EXTENDED_MAJOR_VERSION, /* ERL_DRV_EXTENDED_MAJOR_VERSION */ 
    ERL_DRV_EXTENDED_MAJOR_VERSION, /* ERL_DRV_EXTENDED_MINOR_VERSION */ 
    ERL_DRV_FLAG_USE_PORT_LOCKING  /* ERL_DRV_FLAGs */ 
}; 

DRIVER_INIT(driver_name){ 
    return &driver_entry; 
} 

Not kurmak gerekir

#include "erl_driver.h" 
#include "ei.h" 

eklenmesi gerekmektedir: Eğer olacak C yerine ++ kod C çalıştırmak çalışıyorsanız

extern "C" { 
    DRIVER_INIT(driver_name){ 
    return &driver_entry; 
    } 
} 

ihtiyaç Ve (char *)

ile bir dizgesel döküm gerekecektir

Sonra liman bilgisini

typedef struct 
{ 
    ErlDrvPort port; 
} port_data; 

Son olarak içermesi gerekir bir yapı tanımlamak iyidir, sen bu derlemek isteyeceksiniz tüm fonksiyonları

static ErlDrvData startup_function_name(ErlDrvPort port, char *doc) 
{ 
    /* Plus any other start up methods you need */ 
    port_data* d = (port_data*)driver_alloc(sizeof(port_data)); 
    d->port = port; 
    return (ErlDrvData)d; 
} 

/* Plus any other shutdown methods you need */ 
static void shutdown_function_name(ErlDrvData handle) 
{ 
    driver_free((char*)handle); 
} 

static void outputv_function_name(ErlDrvData handle, ErlIOVec *ev) 
{ 
    port_data* d = (port_data*)handle; 
    char* inputstring = ev->binv[1]->orig_bytes; 
    ErlDrvTermData spec[] = { 
     ERL_DRV_ATOM, driver_mk_atom("ok"), 
     ERL_DRV_BUF2BINARY, inputstring, strlen(inputstring) 
     ERL_DRV_TUPLE, 2 
    }; 
    driver_send_term(d->port,driver_caller(d->port),spec,sizeof(spec)/sizeof(spec[0])); 
} 

kurmak isteyeceksiniz bir paylaşımlı nesne olarak C/C++ kod ve bir çift şeyler yapmak isteyeceksiniz sizi erlang gelen

g++ -fpic -rdynamic -shared file_name -lerl_interface -lei 

Şimdi erl arayüzü ile bağlamak: Sen sürücü

Port = open_port({spawn, driver_name}, [binary]). 

için bir geçişi açmak edeceğiz Sonra

erl_ddll:load_driver("./location/of/driver", driver_name). 

sürücü yüklemek gerekir Ve son olarak sen

port_command(Port, <<"String to Echo Back"), 
receive 
    {ok, String} -> io:format("Received ~p back from the driver") 
end. 
+2

Neden bu adam artık oy almamış! – BAR

İlgili konular