¿Cómo ejecutar el bloque de código C desde Erlang? (O ¿Llamar a una función C desde erlang?)Ejecutar bloque de código C en Erlang
Respuesta
El enfoque más reciente consideraría los NIF http://www.erlang.org/doc/man/erl_nif.html (tenga cuidado, puede bloquear la VM). manera regular para hacer que implica ligado en los conductores (google el enlace, porque anti-spam mantiene)
Esto es para crear un controlador
En primer lugar usted necesita para crear la C/C++ Files que hacer eso.
Tendrán que incluir
#include "erl_driver.h"
#include "ei.h"
A continuación, tendrá que configurar la asignación de controladores
/* 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;
}
Nota: si está intentando ejecutar código C++ en lugar de C se le necesitará
extern "C" {
DRIVER_INIT(driver_name){
return &driver_entry;
}
}
Y tendrá que lanzar cualquier cadena literal con (char *)
entonces es bueno para definir una estructura que va a contener la información de los puertos
typedef struct
{
ErlDrvPort port;
} port_data;
Por último, tendrá que configurar todas las funciones
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]));
}
usted querrá compilar este C/C++ de código en un objeto compartido y vincularlo con la interfaz ERL
g++ -fpic -rdynamic -shared file_name -lerl_interface -lei
Ahora de Erlang que querrá hacer un par de cosas: Tendrá que cargar el controlador
erl_ddll:load_driver("./location/of/driver", driver_name).
A continuación, vamos a abrir un puerto para el conductor
Port = open_port({spawn, driver_name}, [binary]).
Y, por último, usted puede enviar datos al puerto
port_command(Port, <<"String to Echo Back"),
receive
{ok, String} -> io:format("Received ~p back from the driver")
end.
¿Por qué este tipo no recibió más votos? – BAR
- 1. Erlang - C y Erlang
- 2. erlang incrustado en C
- 3. Compilación del código Erlang en Windows
- 4. Intercambio de código en caliente en Erlang
- 5. ¿Es posible serializar un bloque de código C#?
- 6. Ejecutar el código C# en la GPU
- 7. ¿Cómo se puede sincronizar fácilmente un bloque de código C#?
- 8. ¿Es posible ejecutar el código en el bloque try nuevamente después de una excepción en atrapado en el bloque catch?
- 9. ¿Cómo depurar el código de Erlang?
- 10. Guía del código fuente de Erlang
- 11. ¿Cómo ejecutar un robot basado en Erlang? ¿Es posible convertirlo en .hex y ejecutar el microcontrolador?
- 12. ¿Es posible compilar dinámicamente y ejecutar fragmentos de código C#?
- 13. Propiedad de bloque Objective-C con finalización de código Xcode
- 14. Ocultar un bloque de código C++ de Intellisense
- 15. bloque de Ruby a cadena en lugar de ejecutar
- 16. ¿Cómo ejecutar el código C++ sin compilarlo?
- 17. Ejecutar un exe del código C#
- 18. ¿Cómo saltar desde un bloque de código C++?
- 19. Código completo en el bloque try/catch
- 20. Ejecutar código como un usuario diferente (C#)
- 21. reutilizar un bloque de código en YAML
- 22. Cómo ejecutar código después de una llamada a Sytem.exit (0) en un bloque finally
- 23. ¿Cómo puedo ejecutar un bloque de código exactamente una vez en PHP?
- 24. Cómo: ejecutar un bloque de código cada 24 horas en un servidor?
- 25. ¿Es posible ejecutar código nativo de C++ en Windows Azure?
- 26. C# ejecutar código en el interior de atributo personalizado
- 27. Integrar Erlang con C++
- 28. ¿Fragmento de código de Erlang que muestra sus beneficios?
- 29. Código Uso del bloque {} en bash
- 30. Código inesperado en el bloque sincronizado
NIF son algo que probablemente quiera evitar a menos que * realmente * sepa lo que está haciendo. Si llamas a algo que bloquea, has volado el programador de Erlang. Si llamas a algo que se cuelga, tu antiguamente robusto Erlang va a estallar. –