2016-09-29 9 views
4

プログラミングアーランの書籍を読み始めました。ファイルだけで動作する非常に単一の例があります。プロセス通信を実行する

私が実行した場合:

> c(afile_server). 
> c(afile_client). 
> Server = afile_server:start("."). 
> client:get_file(Server, "file1"). 
> client:get_file(Server, "file2"). 
> client:get_file(Server, "file3"). 

すべてが単にファイルで動作します。 3つのファイルの内容が表示されます。

しかし、私はない場合:

> c(afile_server). 
> Server = afile_server:start("."). 
> Server ! { self(), { get_file, "file1" } }. 
> receive 
    { Server, Content } 
     Content 
    end. 

それは単にファイルを動作します。 しかし、私が(最初の呼び出し後に)読み込もうとしているファイルを変更した場合、

> Server ! { self(), { get_file, "file2" } }. 
> receive 
    { Server, Content } 
     Content 
    end. 

受信ブロックと何も返されません。 何とか助けてもらえますか?私は、それは非常にばかげた、間違いだと思います!よろしくです。 よろしくお願いします。

ファイル:

サーバー:

-module(afile_server). 
-export([start/1, loop/1]). 

start(Dir) -> spawn(afile_server, loop, [Dir]). 

loop(Dir) -> 
    receive 
    {Client, list_dir} -> 
     Client ! {self(), file:list_dir(Dir)}; 
    {Client, {get_file, File}} -> 
     Full = filename:join(Dir, File), 
     Client ! {self(), file:read_file(Full)} 
    end, 
    loop(Dir). 

クライアント

%% --- 
%% Excerpted from "Programming Erlang, Second Edition", 
%% published by The Pragmatic Bookshelf. 
%% Copyrights apply to this code. It may not be used to create training material, 
%% courses, books, articles, and the like. Contact us if you are in doubt. 
%% We make no guarantees that this code is fit for any purpose. 
%% Visit http://www.pragmaticprogrammer.com/titles/jaerlang2 for more book information. 
%%--- 
-module(afile_client). 
-export([ls/1, get_file/2]). 

ls(Server) -> 
    Server ! {self(), list_dir}, 
    receive 
    {Server, FileList} -> 
     FileList 
    end. 

get_file(Server, File) -> 
    Server ! {self(), {get_file, File}}, 
    receive 
    {Server, Content} -> 
     Content 
    end. 

答えて

4

あなたはシェルでこれを実行すると、名前Contentを再利用しているためでありますreceiveパターンと2つのファイルはおそらくあなたのファイルシステムに異なる内容を持っているので、プロセスが同じ内容のメッセージを得るまで、receiveはブロックされます。これを修正するには、毎回Contentの別の名前を使用するか、f(Content)を使用して変数を明示的に「忘れる」ことができます。

1> c(afile_server). 
{ok,afile_server} 
2> Server = afile_server:start("."). 
<0.64.0> 
3> Server ! { self(), { get_file, "file1" } }. 
{<0.57.0>,{get_file,"file1"}} 
4> receive {Server, Content} -> Content end. 
{ok,<<"file1\n">>} 
5> Server ! { self(), { get_file, "file2" } }. 
{<0.57.0>,{get_file,"file2"}} 
6> receive {Server, Content} -> Content after 1000 -> timeout end. 
timeout 
7> receive {Server, Content2} -> Content2 end. 
{ok,<<"file2\n">>} 
8> Server ! { self(), { get_file, "file3" } }. 
{<0.57.0>,{get_file,"file3"}} 
9> receive {Server, Content} -> Content after 1000 -> timeout end. 
timeout 
10> f(Content). 
ok 
11> receive {Server, Content} -> Content after 1000 -> timeout end. 
{ok,<<"file3\n">>}