Erlang 错误:生成只有参数的进程,该参数是调用io:format的递归函数

Erlang 错误:生成只有参数的进程,该参数是调用io:format的递归函数,erlang,Erlang,我使用EUNIT模块,包括“EUNIT/include/EUNIT.hrl”。我使用参数func/0调用spawn/1以在测试函数中生成新进程,并在新进程中调用io:format/1。参数func/0是如下所示的递归函数: func() -> A = 2, io:format("#######~p~n", [A]), timer:sleep(1000), func(). 然后 10>bt:test()。 所有2项测试均通过。 好啊 11> =错误报告===2013年6月19日::19:

我使用EUNIT模块,包括“EUNIT/include/EUNIT.hrl”。我使用参数func/0调用spawn/1以在测试函数中生成新进程,并在新进程中调用io:format/1。参数func/0是如下所示的递归函数:

func() -> 
A = 2,
io:format("#######~p~n", [A]),
timer:sleep(1000),
func().
然后

10>bt:test()。
所有2项测试均通过。
好啊
11>
=错误报告===2013年6月19日::19:50:54===
进程中存在错误,退出值为:{终止,[{io,格式,[,”
#######~p~n“,[2]],[]},{bt,func,0,[{file,“bt.erl”},{line,6}]}
怎么了?我该怎么办?

fun()的编写方式是无限递归的。基本上是:

fun() ->
  fun(). 

这将永远不会返回(保持运行),并且可能是EUNIT终止的原因。

如果我正确理解,问题是您正在生成一个运行永无止境函数func()的进程,但当EUNIT进程终止时,它可能会关闭标准输出

这使得发出io:format()的进程退出(引发异常)。事实上,错误报告恰恰提到了这个函数

我的建议是重新审视产生一个永无止境的函数的必要性。

看看。它证实了我对你的问题的感受(尽管给出了理由)。
fun() ->
  fun().