《Erlang 程序设计》练习答案 -- 第二章 Erlang 速览

Erlang 资料本来就非常少,我在网上和 git 都没有找到本书答案,所以打算自己写出来。
一来希望能帮到初学的朋友。
二来若答案有问题,望大家能提出来,共同进步^_^

git 地址 ProgrammingErlangAnswer

第一章 什么是并发 没有练习题。

第二章 Erlang 速览

% (1).启动并停止 Erlang
在终端输入 erl 启动 Erlang shell
在终端输入 Ctrl+c 选择 (a)bort 退出 shell
% (2).在 Erlang shell 里输入一些命令。不要忘了以句号和空白结束命令
1> X = 999.
2> X * 2.
3> io:format("hello world ~n")
% 对 hello.erl 做一些小小的改动。
% 在 shell 里编译并运行它们。
% 如果有错,中止 Erlang shell 并重启 shell。

-module(hello).
-export([start/1]).

start(X) -> 
    io:format("~s~n", [X]).
% (4).运行文件客户端和服务器代码。加入一个名为put_file的命令。你需要添加何种消息?学习如何查阅手册页。查阅手册页的 file 模块

client

-module(afile_client).
-export([ls/1, get_file/2, put_file/3]).

ls(Server) ->
    Server ! {self(), list_dir},    % Pid ! Message 为发送消息
    receive 
        {Server, FileList} ->
            FileList
    end.

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

% put_file 上传文件到 Server 上。
put_file(Server, File, NewName) ->
    case file:read_file(File) of
        % 注意不能直接发送 file:read_file 内容, file:read_file 返回的是一个元组,需要提取出来 Content 二进制信息。 
        {ok, Content} ->
            Server ! {self(), {put_file, Content, NewName}},
            receive
            {Server, Result} ->
                Result
            end;
        {error, Reason} ->
            Reason
    end.

server

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

% 创建一个 Erlang 进程去执行 start
start(Dir) -> 
    spawn(afile_server, loop, [Dir]).

% 接受请求 1.目录 2.文件
% 回复请求
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, Content, NewName}} ->
            Content,
            % 注释为另一种方式,写入描述符 Fd。
            %{Ret, FileFd} = file:open(NewName, [write, raw]),
            %file:write(FileFd, Content),
            %file:close(FileFd),
            FullTwo = filename:join(Dir, NewName),
            Ret = file:write_file(FullTwo, Content),
            Client ! {self(), {Ret, FullTwo, Content}}
    end,
    loop(Dir).

运行截图

《Erlang 程序设计》练习答案 -- 第二章 Erlang 速览_第1张图片

你可能感兴趣的:(erlang,设计)