Erlang Elixir 外部通訊之 NIF

2021-09-19 08:25:44 字數 2564 閱讀 6108

系列:

erlang/elixir: 外部通訊之-nif

erlang/elixir: 外部通訊之-埠驅動

erlang/elixir: 外部通訊之-c節點

本文闡述了如何使用rebar3來構建乙個簡單的nif(內建函式)

讓我們從建立乙個新的名為test_niflib, 使用test_nif專案中的cmake模板開始

$ rebar3 new lib test_nif

===> writing test_nif/src/test_nif.erl

===> writing test_nif/rebar.config

===> writing test_nif/.gitignore

===> writing test_nif/license

===> writing test_nif/readme.md

$ cd test_nif

$ rebar3 new cmake

===> writing c_src/makefile

設定鉤子

..,

]}.,

]}.

makefile是由rebar3 new cmake命令建立的.

下面是乙個nif, 包含乙個repeat函式, 接受乙個pid和乙個erlang term作為引數, 向該pid傳送訊息:

c_src/test_nif.c

#include "erl_nif.h"

erl_nif_term

mk_atom(erlnifenv* env, const char* atom)

return ret;

}erl_nif_term

mk_error(erlnifenv* env, const char* mesg)

static erl_nif_term

repeat(erlnifenv* env, int argc, const erl_nif_term ar**)

if(!enif_is_pid(env, ar**[0]))

if(!enif_get_local_pid(env, ar**[0], &pid))

msg_env = enif_alloc_env();

if(msg_env == null)

copy = enif_make_copy(msg_env, ar**[1]);

if(!enif_send(env, &pid, msg_env, copy))

enif_free_env(msg_env);

return mk_atom(env, "ok");

}static erlniffunc nif_funcs =

};erl_nif_init(test_nif, nif_funcs, null, null, null, null);

測試**src/test_nif.erl

-module(test_nif).

-export([repeat/2]).

-on_load(init/0).

-define(libname, test_nif).

repeat(_, _) ->

not_loaded(?line).

init() ->

->

case filelib:is_dir(filename:join(["..", priv])) of

true ->

filename:join(["..", priv, ?libname]);

_ ->

filename:join([priv, ?libname])

end;

dir ->

filename:join(dir, ?libname)

end,

erlang:load_nif(soname, 0).

not_loaded(line) ->

exit(, ]}).

執行rebar3 shell

$ rebar3 shell

===> verifying dependencies...

===> compiling test_nif

erlang/otp 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false]

eshell v6.3 (abort with ^g)

1> test_nif:repeat(self(), hello).

ok2> receive x -> x end.

hello

Erlang Elixir 連線到遠端節點

通過 erlang 提供的 ssh應用程式連線到遠端 erlang 控制台 生成客戶端 伺服器秘鑰 mkdir client ssh keygen t rsa f tmp client id rsa mkdir server ssh keygen t rsa f tmp server ssh hos...

CentOS 7通過SSH外部訪問

1.安裝centos 7 最小版本後,使用ip addr 查詢ip 2.進入cd etc sysconfig network scripts vi ifcfg ens33對檔案進行修改 type ethernet proxy method none browser only no bootproto...

mysql外部鎖定 Mysql外部鎖定

mysql外部鎖定是鎖定方式之一,下面就將對mysql外部鎖定進行詳細的介紹,供您參考,如果您對mysql外部鎖定方面感興趣的話,不妨一看。mysql外部鎖定 伺服器還可以使用外部鎖定 檔案級鎖 來防止其它程式在伺服器使用表時修改檔案。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或is...