Concurrency 退出值undeferlang Spawn

Concurrency 退出值undeferlang Spawn,concurrency,erlang,spawn,Concurrency,Erlang,Spawn,我在Ubuntu服务器机器上运行以下Erlang代码时出错,它在运行Solus的机器上正常运行。我是Erlang新手,不知道如何读取错误,因为所有其他示例的错误代码中只有一个函数和模块。 我有两个文件 传感器: 和观察者: -module(watcher). -export([start/1, createSensor/3, restartASensor/2, watch/1]). start(NumOfSensor) -> if NumOfSensor == 0

我在Ubuntu服务器机器上运行以下Erlang代码时出错,它在运行Solus的机器上正常运行。我是Erlang新手,不知道如何读取错误,因为所有其他示例的错误代码中只有一个函数和模块。 我有两个文件 传感器:

和观察者:

-module(watcher).
-export([start/1, createSensor/3, restartASensor/2, watch/1]).

start(NumOfSensor) ->
    if
        NumOfSensor == 0 ->
            io:format("Please enter a number greater than 0.~n");
        true ->
            createSensor(NumOfSensor, [], 0)
    end.

createSensor(NumOfSensor, SensorList, SensorId) ->
    if
        length(SensorList) == 10 ->
            io:format("Start watching:~n"),
            [io:format("    Id: ~p, Pid: ~p~n", [Id, Pid]) || {Id, Pid} <- SensorList],
            if NumOfSensor /= 0 -> 
                spawn(watcher, createSensor, [NumOfSensor, [], SensorId]),
                watch(SensorList);
            true ->
                watch(SensorList)
            end;
        NumOfSensor == 0 ->
            io:format("Start watching~n"),
            [io:format("    Id: ~p, Pid: ~p~n", [Id, Pid]) || {Id, Pid} <- SensorList],
            watch(SensorList);
        true ->
            SensorPid = spawn_monitor(sensor, start, [self(), SensorId]),
            createSensor(NumOfSensor - 1, lists:merge(SensorList, [{SensorId, SensorPid}]), SensorId + 1)
    end.

restartASensor(SensorList, SensorId) ->
    {SensorPid, _} = spawn_monitor(sensor, start, [self(), SensorId]),
    io:format("    Restarted sensor: ~p, new Pid: ~p~n", [SensorId, SensorPid]),
    NewList = lists:merge(SensorList, [{SensorId, SensorPid}]),
    watch(NewList).

watch(SensorList) ->
    receive
        {kill, {From, FromId}, error} ->
            io:format("    Sensor ~p died~n", [FromId]),
            restartASensor(lists:delete({FromId, From}, SensorList), FromId);
        {Measurement, {From, FromId}, Ref} ->
            io:format("MSG: ~2p, From sensor ~4p~n", [Measurement, FromId]),
            From ! {ok, Ref},
            watch(SensorList)
    end.
-模块(观察者)。
-导出([start/1,createSensor/3,RestartSensor/2,watch/1])。
启动(NUMOF传感器)->
如果
NumOfSensor==0->
io:格式(“请输入一个大于0.~n的数字”);
正确->
createSensor(NumOfSensor,[],0)
结束。
createSensor(NumOfSensor、SensorList、SensorId)->
如果
长度(传感器列表)==10->
io:format(“开始监视:~n”),
[io:format(“Id:~p,Pid:~p~n,[Id,Pid])|{Id,Pid}
spawn(watcher,createSensor,[NumOfSensor,[],SensorId]),
监视(传感器列表);
正确->
监视(传感器列表)
结束;
NumOfSensor==0->
io:格式化(“开始观看~n”),
[io:format(“Id:~p,Pid:~p~n,[Id,Pid])|{Id,Pid}
SensorPid=spawn_监视器(传感器、启动、[self()、传感器ID]),
createSensor(NumOfSensor-1,list:merge(SensorList,[{SensorId,SensorPid}]),SensorId+1)
结束。
重启传感器(传感器列表,传感器ID)->
{SensorPid,}=spawn_监视器(传感器,启动,[self(),SensorId]),
io:格式(“重新启动的传感器:~p,新Pid:~p~n”,[SensorId,SensorPid]),
NewList=list:merge(SensorList,[{SensorId,SensorPid}]),
观看(新列表)。
监视(传感器列表)->
接收
{kill,{From,FromId},error}->
io:格式(“传感器~p~n”,[FromId]),
RestartSensor(列表:删除({FromId,From},SensorList),FromId);
{测量,{From,FromId},Ref}->
io:格式(“消息:~2p,来自传感器~4p~n”,[Measurement,FromId]),
从!{好的,Ref},
监视(传感器列表)
结束。
这将为我提供以下输出:

Eshell V5.8.5  (abort with ^G)
1> c(watcher).
{ok,watcher}
2> watcher:start(1).
Start watching
    Id: 0, Pid: <0.39.0>

=ERROR REPORT==== 18-Nov-2016::19:32:35 ===
Error in process <0.39.0> with exit value: {undef,[{rand,uniform,[11]},{sensor,senseAndReport,3}]}
Eshell V5.8.5(使用^G中止)
1> c(观察者)。
{好的,观察者}
2> 观察者:开始(1)。
开始看
Id:0,Pid:
=错误报告===2016年11月18日::19:32:35===
使用退出值处理时出错:{unde,[{rand,uniform,[11]},{sensor,senseAndReport,3}]}

多伯特的评论是正确的答案。我在Ubuntu机器上使用的Erlang版本较旧,需要用随机模块替换rand模块。

最近添加了
rand
模块。你在Ubuntu机器上运行的Erlang版本比Solus版本旧吗?@Dogbert就是这样!需要随机模块吗开始,非常感谢。
Eshell V5.8.5  (abort with ^G)
1> c(watcher).
{ok,watcher}
2> watcher:start(1).
Start watching
    Id: 0, Pid: <0.39.0>

=ERROR REPORT==== 18-Nov-2016::19:32:35 ===
Error in process <0.39.0> with exit value: {undef,[{rand,uniform,[11]},{sensor,senseAndReport,3}]}