2
A
回答
2
之間的共享存儲環境,如果通過「陣列」你的意思是你的C/C++可以作爲一個數組很容易地訪問的東西,那麼你要使用Erlang二進制。這些很容易以C/C++代碼處理,編寫爲NIF或driver。例如,給定一個Erlang函數採用二進制作爲參數,你可以在C作爲NIF實現它,如下圖所示:
-module(nif).
-export([binfunc/1]).
-on_load(init/0).
init() ->
erlang:load_nif("./nif", 0).
binfunc(_Bin) ->
{error, "nif not loaded"}.
:
#include <stdio.h>
#include "erl_nif.h"
static ERL_NIF_TERM
binfunc(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary bin;
unsigned i;
if (argc != 1 || !enif_inspect_binary(env, argv[0], &bin))
return enif_make_badarg(env);
printf("received binary of length %zu\r\ndata: ", bin.size);
for (i = 0; i < bin.size; ++i)
printf("%x ", bin.data[i]);
printf("\r\n");
return enif_make_atom(env, "ok");
}
static ErlNifFunc nif_funcs[] =
{
{"binfunc", 1, binfunc}
};
ERL_NIF_INIT(nif,nif_funcs,NULL,NULL,NULL,NULL)
Erlang的功能會這樣來實現
運行它應該是這樣的:
Erlang/OTP 17 [RELEASE CANDIDATE 2] [erts-6.0] [source-f91fbb2] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V6.0 (abort with ^G)
1> nif:binfunc(<<"abcdef">>).
received binary of length 6
data: 61 62 63 64 65 66
ok
這實現字符的只是一個簡單的數組,但使用Erlang's powerful bit syntax可以方便地實現結構,數組,等等,你可以EXC在Erlang和C/C++之間掛起。
相關問題
- 1. IPC與共享內存的共享內存有什麼區別?
- 2. 共享內存與碼頭
- 3. 雲與共享內存
- 4. CUDA,CC 2.0卡上的共享內存限制
- 5. Erlang共享ETS表
- 6. 內存共享
- 7. ZeosLib與MYSQL的共享內存協議?
- 8. 與OpenACC共享內存的使用
- 9. CUDA共享內存
- 10. C共享內存
- 11. 在共享內存
- 12. RDMA內存共享
- 13. 共享內存段
- 14. Linux共享內存
- 15. 通過共享內存共享指針
- 16. activerecord內存共享緩存
- 17. 多進程python與共享內存
- 18. 與System V段錯誤共享內存
- 19. 如何與Golang共享內存?
- 20. 共享內存,並與蟒蛇
- 21. 與信號量共享內存同步
- 22. 如何與shm_open共享現有內存?
- 23. 使用共享內存與叉()
- 24. 共享內存段vs共享內存段
- 25. C++共享內存泄漏,如何清除共享內存?
- 26. 增加共享內存的內存
- 27. cuda中的共享內存
- 28. 共享內存在Unix的
- 29. OpenCL中的共享內存
- 30. DLL中的共享內存
非常感謝@Steve,但這隻適用於簡單的C程序。我不能將它用於大型項目。我想知道是否有一種在兩個完全獨立的應用程序之間共享大數據的有效方式。 –
實際上,這種技術適用於遠遠超出「簡單C程序」範圍的大型應用程序。但是放在一邊,你有沒有考慮使用你的應用程序之間共享的內存數據庫? –
@Steve,我認爲這會讓事情變得更加複雜。讓我再試一次。我會讓你知道的。謝謝! –