2016-09-29 4 views
4

Ich habe gerade angefangen, das Programmieren Erlang Buch zu lesen. Es gibt sehr einzelnes Beispiel, das nur Datei funktioniert.Durchführen von Prozessen Kommunikation

Wenn ich ausführen:

> 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"). 

alles funktioniert Datei nur. Der Inhalt der drei Dateien wird angezeigt.

Aber wenn ich tun:

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

Es funktioniert nur einreichen. Aber wenn ich die Datei ändere, die ich versuche zu lesen (nach dem ersten Aufruf), z.

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

Die empfangenen Blöcke und nichts wird zurückgegeben. Könnt ihr irgendwie helfen? Ich denke, es ist ein sehr dummer Fehler! Grüße.

Dateien:

Server:

-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). 

Kunde

%% --- 
%% 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. 

Antwort

4

Das liegt daran, dass Sie dies in dem Shell laufen lassen und die Wiederverwendung von dem Namen Content in die receive Muster und die 2 Dateien haben vermutlich unterschiedliche Inhalte in Ihrem Dateisystem, so dass die receive blockiert, bis der Prozess eine Nachricht mit dem gleichen Inhalt erhält. Um dies zu beheben, können Sie entweder jedes Mal einen anderen Namen für Content verwenden oder die Variable explizit mit f(Content) "vergessen".

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">>} 
Verwandte Themen