如何在新过程中从stdin读取?我只能在主要过程中放入线并打印。我应该传递给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 - 如何在“非主要”过程中从控制台读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40723320/

10-11 00:41