Erlang进程试图杀死自己时挂起

Posted

技术标签:

【中文标题】Erlang进程试图杀死自己时挂起【英文标题】:Erlang process hanging when it tries to kill itself 【发布时间】:2017-08-05 04:02:40 【问题描述】:

我正在使用这个脚本运行我的 erlang 进程

#!/bin/sh
stty -f /dev/tty icanon raw
erl -pa ./ -run thing start -run init -noshell
stty echo echok icanon -raw

我的 Erlang 进程:

-module(thing).
-compile(export_all).

process(<<27>>) ->
  io:fwrite("Ch: ~w", [<<27>>]),
  exit(normal);
process(Ch) ->
  io:fwrite("Ch: ~w", [Ch]),
  get_char().

get_char() ->
    Ch = io:get_chars("p: ", 1),
    process(Ch).

start() ->
    io:setopts([binary, true]),
    get_char().

当我运行./invoke.sh 时,我按键并看到字符按预期打印。当我点击转义时,shell 窗口停止响应(我必须从终端关闭窗口)。为什么会这样?

【问题讨论】:

尝试输入stty sane CTRL-J。如果有帮助,erl 可能会给出一个非零退出代码。 【参考方案1】:

当您调用 exit/1 时,它只会终止 erlang 进程,不会停止 erlang 运行时系统(梁)。由于您在没有外壳的情况下运行,因此您会得到窗口没有响应的行为。如果您从任务管理器或通过 pkill 终止梁进程,您将获得命令行。 一个简单的解决方法是更换 exit(normal)halt()see doc

【讨论】:

以上是关于Erlang进程试图杀死自己时挂起的主要内容,如果未能解决你的问题,请参考以下文章

Apache/PHP 进程在与 MySQL 交互时挂起

Erlang - 将每个“erlang 进程”映射到新的内核线程

linux:启动时挂起进程

1.Erlang/OTP平台

Erlang 主管进程

在初始化Erlang管理程序进程时添加gen_event处理程序