Concurrency 退出值undeferlang Spawn
我在Ubuntu服务器机器上运行以下Erlang代码时出错,它在运行Solus的机器上正常运行。我是Erlang新手,不知道如何读取错误,因为所有其他示例的错误代码中只有一个函数和模块。 我有两个文件 传感器: 和观察者: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
-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}]}