C Kod Bloğu Erlang'dan Nasıl Çalışır? (Ya da erlang'dan bir C işlevi çağırın?)Erlang'da C Kod Bloğunu Çalıştırın
cevap
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
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 gerekecektirSonra 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.
Neden bu adam artık oy almamış! – BAR
- 1. IllegalArgumentException/bloğunu Aşağıdaki kod var
- 2. Yalnızca tüm kod bloğunu çalıştırırken hata oluştu
- 3. Kuruluş kodu içinde Java kod bloğunu yürütme
- 4. Yakut kurtarma ve özel kod bloğunu
- 5. Bir kod bloğunu içe ve dışa doğru girme vim
- 6. Dönüştürme Objective-C bloğunu Swift kapanışına dönüştür
- 7. TextMate'de büyük bir kod bloğunu yorumlamanın bir yolu var mı?
- 8. C programında Linux komutunu çalıştırın
- 9. C# veya vb Kod bloğunu tekrar deneme için jenerik işlev n sayısı
- 10. Birçok kez kullanılacak bir kod bloğunu nasıl tanımlarsınız? kod bloğu tarafından
- 11. Linux'ta .NET exe'yi çalıştırın
- 12. C programlamayı C olarak çalıştırın ve bitirmek için beklemeyin
- 13. Textarea div bloğunu nasıl dolduracak?
- 14. NSData'nın keyfi bir bloğunu çözme?
- 15. C# Kod boyutu ve Kod yürütme süresi
- 16. HDF5 C Kod üretimi
- 17. C# Erişilemeyen kod algılandı
- 18. C++ kod içermez
- 19. C# kod sınıf diyagramı
- 20. C# Kod boyutunu belirle
- 21. Kod ayrıştırma C#
- 22. Netbeans Kod Yardımı C++
- 23. Ben çal çalıştırın ve
- 24. Başlıkları olmadığı bir bilgisayara derlenmiş bir C programı çalıştırın.
- 25. Dinamik olarak oluşturulmuş derlemeyi C (GNU/Linux) olarak çalıştırın
- 26. Pitest'i komut satırından çalıştırın
- 27. Görüntü bloğunu MySQL içine ekleme - NullPointerException
- 28. Netbeans C/C++ JavaDoc kod tamamlama
- 29. C/C++ Makro oluşturma vs. Kod üretimi
- 30. SASS kod ayrıştırma bloğunu önleyin, ancak yine de son css dosyasına aktarın
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. –