Programming Erlang, 2 e., Chapter 2, Exercise 4, put_file()

David Christensen dpchrist@REDACTED
Fri Dec 31 05:50:38 CET 2021


erlang-questions:

I am working my way through "Programming Erlang", 2 e.:

2021-12-30 20:00:05 dpchrist@REDACTED ~/sandbox/erlang
$ cat /etc/debian_version ; uname -a ; dpkg-query -W erlang
9.13
Linux tinkywinky 4.9.0-17-amd64 #1 SMP Debian 4.9.290-1 (2021-12-12) 
x86_64 GNU/Linux
erlang	1:19.2.1+dfsg-2+deb9u3


Chapter 2, Exercise 4, requests that I add a "put_file" command to the 
file client and server code.  RTFM I found the file:write_file() 
function.  I can test it with the Erlang shell, and it works:

2021-12-30 20:29:34 dpchrist@REDACTED ~/sandbox/erlang
$ erl
Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [smp:8:8] 
[async-threads:10] [kernel-poll:false]

Eshell V8.2.1  (abort with ^G)
1> file:write_file("foo.2", "this is foo.2\n").
ok
2> halt().

2021-12-30 20:30:09 dpchrist@REDACTED ~/sandbox/erlang
$ cat foo.2
this is foo.2


I have extended afile_server.erl with a "put_file" command that calls 
file::write_file():

2021-12-30 20:34:25 dpchrist@REDACTED ~/sandbox/erlang
$ cat ex0204_server.erl
-module(ex0204_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)};
	{Client, {put_file, File, Bytes}} ->
	    Full = filename:join(Dir, File),
	    Client ! {self(), file:write_file(Full, Bytes)}
     end,
     loop(Dir).


Testing in the Erlang shell, start() works, the "list_dir" command and 
reply work, and the "get_file" command and reply work, but the shell 
hangs when I attempt to receive a reply for the "put_file" command:

2021-12-30 20:35:23 dpchrist@REDACTED ~/sandbox/erlang
$ erl
Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [smp:8:8] 
[async-threads:10] [kernel-poll:false]

Eshell V8.2.1  (abort with ^G)
1> c(ex0204_server).
{ok,ex0204_server}
2> Server = ex0204_server:start(".").
<0.64.0>
3> Server ! {self(), list_dir}.
{<0.57.0>,list_dir}
4> receive A -> A end.
{<0.64.0>,
  {ok,[".ex0204_client.erl.swp","Makefile","afile_client.erl",
       "afile_server.beam","ex0204_server.erl","hello.beam",
       "ex0204_client.erl","hello.erl","afile_server.erl","CVS",
       "afile_server.run","ex0204_server.beam"]}}
5> Server ! {self(), {get_file, "hello.erl"}}.
{<0.57.0>,{get_file,"hello.erl"}}
6> receive B -> B end.
{<0.64.0>,
  {ok,<<"-module(hello).\n-export([start/0]).\n\nstart() ->\n 
io:format(\"hello, world!~n\").\n">>}}
7> Server ! {self(), {put_file, "foo.txt", "foo on you!\n"}}.
{<0.57.0>,{put_file,"foo.txt","foo on you!\n"}}
8> receive C -> C end.

BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
        (v)ersion (k)ill (D)b-tables (d)istribution
a


Why?


David


More information about the erlang-questions mailing list