相关疑难解决方法(0)

如何知道erlang中节点的id

当我们运行 node() 命令时,我们会得到节点的 pid。格式 <0.X.0> 如果我们在同一个节点上,并且当我们从其他节点运行相同的命令时得到 <XY0> 形式的结果。我想知道如何从同一节点上的 < XY0> 获取值 X。

erlang pid

5
推荐指数
1
解决办法
1306
查看次数

是否可以“用完” Erlang进程ID?

这个问题的答案说,Erlang PID实际上是28位整数,其中前10个是节点号(本地节点始终为0),其后18个是全局过程表的索引。因此,如果我的理解是正确的,那么假设我们仅在单个节点上工作,则唯一pid的最大数量为2 ^ 18,即大约262,000。这是否是我可以随时间在单个Erlang节点上产生的最大进程数?如果我有一个运行时间很长的Erlang节点,分配我的第2 ^ 18 + 1个节点后,VM会立即崩溃吗?还是可以重用旧的未使用的pid?如果是这样,该过程如何在虚拟机级别实施?

erlang pid

5
推荐指数
1
解决办法
502
查看次数

list转换为pid函数list_to_pid/1限制

当测试开源项目'gproc'函数时,我发现list_to_pid对于本地pid是好的,而对于远程pid则不行.我的erlang运行时是R15B.

(dist_test_n2@yus-iMac.local)29> D = list_to_pid("<0.239.0>").
<0.239.0>
(dist_test_n2@yus-iMac.local)30> D == self(). %% equal here
true
(dist_test_n2@yus-iMac.local)31> f(E).
ok
(dist_test_n2@yus-iMac.local)32> E = gproc:where(Name).       
<8969.239.0>
(dist_test_n2@yus-iMac.local)33> F = list_to_pid("<8969.239.0>").
<8969.239.0>
(dist_test_n2@yus-iMac.local)34> F == E. %% not equal here
false
Run Code Online (Sandbox Code Playgroud)

从用户指南有关此功能,没有这样的限制.是bug吗?

erlang

4
推荐指数
1
解决办法
6101
查看次数

如何将远程pid转换为节点名称?

在决定一个客户端参数结构到一个OTPgen_server 时,是否需要将Pid和 都Node name插入到参数结构中?

给定一个遥控器pid,是否可以转换pidnode name?我的意思是完整的节点名称,例如"emacs@yus-iMac.local".

erlang

4
推荐指数
1
解决办法
1385
查看次数

global:whereis_name()从不同的终端返回不同的Pid

有人可以向我解释为什么Pid从全局返回:whereis_name()在不同的终端(在OSX下,至少)完成时是不同的.

下面是一个简单的演示.

demo.erl
-module(demo).

-export([start/0, loop/0, echo/1]).


start() ->
    Pid = spawn(?MODULE, loop, []),
    yes = global:register_name('demo', Pid).

echo(Msg) ->
    global:send('demo', Msg).

loop() ->
    receive
        Msg -> 
            io:format("demo: ~w~n", [Msg]),
            loop()
    end.
Run Code Online (Sandbox Code Playgroud)

航站楼A:

erl -sname A -setcookie demo
(A@local)1> demo:start().
yes
(A@local)2> global:whereis_name(demo).
<0.39.0>
(A@local)3> demo:echo(aaa).
<0.39.0>
demo: aaa  
demo: bbb  
demo: ccc  
(A@local)4>
Run Code Online (Sandbox Code Playgroud)

B航站楼:

erl -sname B -setcookie demo
(B@local)1> net_kernel:connect_node('A@local').
true
(B@local)2> demo:echo(bbb).                     
<6572.39.0>
(B@local)3> global:whereis_name(demo).
<6572.39.0>
Run Code Online (Sandbox Code Playgroud)

终端C:

erl -sname C -setcookie demo
(C@local)1> net_kernel:connect_node('A@local').
true
(C@local)2> demo:echo(ccc). …
Run Code Online (Sandbox Code Playgroud)

erlang

2
推荐指数
1
解决办法
755
查看次数

修改Erlang VM Pid

如何更改Erlang VM以使用其中一个pid值的随机128位值?

我现在可以设置的最大值似乎是:

32> pid(1, 32767, 8191).
** exception error: bad argument
     in function  list_to_pid/1
        called as list_to_pid("<1.32767.8191>")
     in call from c:pid/3 (c.erl, line 419)
33> pid(0, 32767, 8191).
<0.32767.8191>
Run Code Online (Sandbox Code Playgroud)

看起来pid的产生归结为这样的事情erts/emulator/beam/erl_ptab.h:283:

ERTS_GLB_INLINE Eterm
erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag)
{
    HUint huint;
    Uint32 low_data = (Uint32) data;
    low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1;
    low_data <<= ERTS_PTAB_ID_DATA_SHIFT;
    huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data);
    huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag);
    return (Eterm) huint.val;
}
Run Code Online (Sandbox Code Playgroud)

c erlang pid beam vm-implementation

2
推荐指数
1
解决办法
254
查看次数

在连接的节点上生成的进程获得相同的PID

我有4个erlang节点在多进程应用程序上一起工作.在我的订单中,一个进程是监视器,它在区域上绘制进程的位置,另外3个节点处理进程的位置和移动.在监视器上,当密钥是进程PID时,我使用ETS数据库存储位置,我注意到节点创建的进程具有相同的PID,这显然会中断整个系统的管理.

我试图将进程连接到:

net_adm:ping(...).
net_kernel:connect(...).
Run Code Online (Sandbox Code Playgroud)

希望当节点彼此意识到时,他们会给出不同的PID,但是没有用.

erlang

2
推荐指数
1
解决办法
147
查看次数

我如何将Erlang中的PID转换为二进制1字节?

我需要在Erlang中将pid转换为二进制,并将其发送到另一个pid.但我需要二进制数据的大小为1个字节.它可以吗?

erlang

0
推荐指数
1
解决办法
732
查看次数

标签 统计

erlang ×8

pid ×3

beam ×1

c ×1

vm-implementation ×1