input - 如何在 "not main"进程中从控制台读取

标签 input concurrency erlang

如何在新进程中读取标准输入?我只能在主进程中放置行并打印它。我应该传递给 get_line 控制台设备或类似的东西还是不可能?

我的代码:

-module(inputTest).
-compile([export_all]).

run() ->
  Message = io:get_line("[New process] Put sth: "),
  io:format("[New process] data: ~p~n", [Message]).


main() ->
  Message = io:get_line("[Main] Put sth: "),
  io:format("[Main] data: ~p~n", [Message]),
  spawn(?MODULE, run, []).

最佳答案

问题是您的 main/0 进程生成 run/0 然后立即退出。您应该让 main/0 等待,直到 run/0 完成。以下是您可以执行此操作的方法:

-module(inputTest).
-compile([export_all]).

run(Parent) ->
    Message = io:get_line("[New process] Put sth: "),
    io:format("[New process] data: ~p~n", [Message]),
    Parent ! {self(), ok}.

main() ->
    Message = io:get_line("[Main] Put sth: "),
    io:format("[Main] data: ~p~n", [Message]),
    Pid = spawn(?MODULE, run, [self()]),
    receive
        {Pid, _} ->
            ok
    end.

生成 run/1 后 - 请注意,我们更改了它以将进程 ID 传递给它 - 我们等待接收来自它的消息。在 run/1 中,一旦我们打印到输出,我们就会向父级发送一条消息,让它知道我们已经完成了。在 erl shell 中运行它会产生以下结果:

1> inputTest:main().
[Main] Put sth: main
[Main] data: "main\n"
[New process] Put sth: run/1
[New process] data: "run/1\n"
ok

关于input - 如何在 "not main"进程中从控制台读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723320/

相关文章:

javascript - Highcharts 增加/减少输入数据

html - 更改/样式化 HTML 中的单个输入元素

java - 为什么 java 找不到我的文件

caching - 如何存储模块级一次性写入状态?

erlang - 同一erlang记录的不同 View

html 模式 ="[A-Za-z]{50}"表示有效输入无效

java - 在 JCIP 样本 "Listing 5.19 Memoizer"中,当 ExecutionException 发生时应该删除缓存

events - F# 使用代理将历史事件与两个代理之间的模拟交互交错

java - AtomicStampedReference.get()方法: why parameter is array?

erlang - Mochiweb 端口 80