2016-11-21 58 views
2

如何在新进程中读取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, []). 

回答

6

的问题是,你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外壳中运行此项产生以下内容:

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

非常感谢! 我不知道主进程必须活着才能使用输入函数。 –